40 lines
2.3 KiB
Markdown
40 lines
2.3 KiB
Markdown
# 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 0–63** — 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 |
|