AyCode.Core/AyCode.Core.Serializers.Sou.../README.md

40 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AyCode.Core.Serializers.SourceGenerator
Roslyn incremental source generator that produces optimized `IGeneratedBinaryWriter` and `IGeneratedBinaryReader` implementations for types marked with `[AcBinarySerializable]`. Eliminates runtime reflection on serialization hot paths.
Targets **netstandard2.0** (required for Roslyn analyzers/generators).
## Key Files
- **`AcBinarySourceGenerator.cs`** — Single-file `IIncrementalGenerator` (~2100 lines). Generates:
- `{ClassName}_GeneratedWriter` — Per-type writer with `ScanObject()` + `WriteProperties()` methods. Handles primitives, strings (with interning), collections, dictionaries, complex nested types, and polymorphic objects.
- `{ClassName}_GeneratedReader` — Per-type reader with `ReadProperties()` method.
- `ModuleInitializer` — Auto-registers all generated writers/readers at startup.
- Circular reference detection with `ACBIN001` diagnostic warning.
## Slot Allocation
Each generated writer reserves a unique type slot via `AcBinarySerializer.AllocateWrapperSlot()` (static field initializer, `Interlocked.Increment`).
- **Slots 063** — reserved for runtime polymorphic types (assigned dynamically on first encounter)
- **Slots 64+** — source-generated types (allocated at `[ModuleInitializer]` registration time)
**Slot indices are NOT stable across compilations.** The order depends on Roslyn's `ForAttributeWithMetadataName()` enumeration order, which may vary between builds. This is fine because slots are only meaningful within a single serialization/deserialization session — they are never persisted to disk or sent over the wire as slot indices (the wire format uses type names or metadata hashes for cross-session/cross-type compatibility).
## Feature Flags
The `[AcBinarySerializable]` attribute supports per-type feature control:
- `enableMetadata` — Property hash metadata for cross-type deserialization
- `enableIdTracking` — IId-based reference tracking
- `enableRefHandling` — General reference tracking
- `enableInternString` — String interning/deduplication
Disabled features eliminate corresponding code blocks from generated output (zero dead code).
## Dependencies
| Dependency | Purpose |
|---|---|
| `Microsoft.CodeAnalysis.CSharp` | Roslyn syntax/semantic APIs |
| `Microsoft.CodeAnalysis.Analyzers` | Analyzer best practices |