4.1 KiB
4.1 KiB
Serializers
High-performance serialization framework — Binary, JSON, Toon — on shared infrastructure.
Folder Structure
| Folder | Purpose |
|---|---|
Binaries/ |
High-performance binary serialization with two-phase scan+serialize |
Jsons/ |
Custom JSON serialization using Utf8JsonWriter/Utf8JsonReader |
Toons/ |
LLM-optimized Token-Oriented Object Notation with @meta/@data sections |
Expressions/ |
Expression tree serialization (LINQ Expression ↔ DTO) |
Attributes/ |
Source generator marker attributes |
Shared Infrastructure (Root Files)
Core Base Classes
AcSerializerContextBase.cs— Generic base contextAcSerializerContextBase<TMetadata, TOptions>with metadata caching, wrapper slot management, and context pooling. All three serializers derive from this.AcSerializerOptions.cs— Base options: reference handling mode, max depth, custom property mapping,ThrowOnCircularReference.TypeMetadataBase.cs— Cached type analysis: readable/writable properties,IIddetection, complexity flags (HasComplexProperties,NeedsReferenceTracking,IsCollection).TypeMetadataWrapper.cs— Wraps metadata with per-context tracking state: typedIdentityMapinstances (Int32/Int64/Guid),SmallIdBitmap, polymorphic cache, source-gen reader/writer registry lookup.
Serialization/Deserialization Bases
SerializationContextBase.cs— Base for serialization contexts.DeserializationContextBase.cs— Base for deserialization contexts.SerializeTypeMetadataBase.cs— Base for format-specific serialize metadata.DeserializeTypeMetadataBase.cs— Base for format-specific deserialize metadata.DeserializeChainBase.cs— Deserialization chain pattern.DeserializeCrossTypeBase.cs— Cross-type deserialization support.
Property Handling
PropertyAccessorBase.cs— Base for reading property values during serialization.PropertySetterBase.cs— Base for writing property values during deserialization.PropertyMetadataBase.cs— Base property metadata shared across formats.
Utilities
AcSerializerCommon.cs— Expression type checking, queryable type refs,ThreadLocalcache helpers, compiled constructor creation.IdentityMap.cs— High-perf hash table optimized for small int keys (bitmap) + chaining for large keys. Used for reference tracking.FnvHash.cs— Deterministic FNV-1a property name hashing (used in BinaryUseMetadatamode).ReferenceTracker.cs—ReferenceEqualityComparerfor object identity-based tracking dictionaries.IIdCollectionMergeHelper.cs— Collection merge operations duringPopulateMerge(handles orphaned item removal).
Architecture
Generic Specialization Pattern
AcSerializerContextBase<TMetadata, TOptions>
├─ BinarySerializationContext <BinarySerializeTypeMetadata, AcBinarySerializerOptions>
├─ JsonSerializationContext <JsonSerializeTypeMetadata, AcJsonSerializerOptions>
└─ ToonSerializationContext <ToonSerializeTypeMetadata, AcToonSerializerOptions>
Key Design Decisions
- Sealed derived classes — All context implementations are sealed for JIT direct calling (no virtual dispatch on hot paths).
- Context pooling — Contexts are reused across serializations via thread-safe pools.
ResetTracking()clears reference maps on pool return. - Property ordering — Hierarchy-aware (base→derived) then alphabetical. Ensures stable property indices across type versions.
- Typed reference access — No boxing for common ID types. Pre-cast delegates:
RefIdGetterInt32,RefIdGetterInt64,RefIdGetterGuid. - Zero-allocation hot paths — Buffer owned by context,
Span-based operations,ArrayPoolfor large allocations. - Global metadata cache — Thread-safe per
TMetadatatype, shared across all contexts of that serializer type.
Reference Handling Modes
| Mode | Description |
|---|---|
None |
No tracking, fastest path |
OnlyId |
Only IId<T> types tracked (Binary only) |
All |
All reference types tracked (required for JSON $ref) |