Move DrainFromAsync to tests, add in-memory benchmarks - Moved AsyncPipeReaderInputExtensions.DrainFromAsync from the main framework to test-only assembly; no longer public API. - Removed AcBinaryDeserializer.DeserializeFromPipeReaderAsync<T> from public API; tests now inline drain+deserialize logic. - Added AcBinaryInMemoryPipeBenchmark and AcBinaryInMemoryRawByteArrayBenchmark to complete 2x2 transport × wire-format benchmark matrix. - Refactored benchmark runner for interactive menu, settings, and CLI parsing. - Expanded XML docs for AsyncPipeReaderInput and AsyncPipeWriterOutput to clarify push-pattern and real-world usage. - Updated BINARY_ASYNCPIPE_TODO.md and related docs to reflect these changes. |
||
|---|---|---|
| .. | ||
| AcBinaryDeserializationException.cs | ||
| AcBinaryDeserializer.BinaryDeserializationContext.Read.cs | ||
| AcBinaryDeserializer.BinaryDeserializationContext.cs | ||
| AcBinaryDeserializer.BinaryDeserializeTypeMetadata.cs | ||
| AcBinaryDeserializer.CrossType.cs | ||
| AcBinaryDeserializer.Populate.cs | ||
| AcBinaryDeserializer.cs | ||
| AcBinarySerializer.BinarySerializationContext.PropertyWriters.cs | ||
| AcBinarySerializer.BinarySerializationContext.cs | ||
| AcBinarySerializer.BinarySerializationResult.cs | ||
| AcBinarySerializer.BinarySerializeTypeMetadata.cs | ||
| AcBinarySerializer.ScanPass.cs | ||
| AcBinarySerializer.cs | ||
| AcBinarySerializerOptions.cs | ||
| AcStringInternAttribute.cs | ||
| ArrayBinaryInput.cs | ||
| ArrayBinaryOutput.cs | ||
| ArrayPooledBufferWriter.cs | ||
| AsyncPipeReaderInput.cs | ||
| AsyncPipeReaderInputAdapter.cs | ||
| AsyncPipeWriterOutput.cs | ||
| BinaryOutputBase.cs | ||
| BinaryPropertyAccessorBase.cs | ||
| BinaryPropertyFilterContext.cs | ||
| BinaryPropertySetterBase.cs | ||
| BinaryTypeCode.cs | ||
| BufferWriterBinaryOutput.cs | ||
| IBinaryInputBase.cs | ||
| IGeneratedBinaryReader.cs | ||
| IGeneratedBinaryWriter.cs | ||
| README.md | ||
| SegmentBufferReader.cs | ||
| SegmentBufferReaderInput.cs | ||
| SequenceBinaryInput.cs | ||
| StringInterningMode.cs | ||
| TypeConversionInfo.cs | ||
README.md
Binaries
High-performance binary serialization/deserialization. Two-phase processing, multiple wire modes, string interning, source generation. Primary goal: speed.
Implementation details (zero virtual dispatch, buffer management):
../../docs/BINARY/BINARY_IMPLEMENTATION.mdOutput writers (ArrayBinaryOutput, BufferWriterBinaryOutput, chunk sizing):../../docs/BINARY/BINARY_WRITERS.mdSource generation (SGen architecture, hybrid model, bridge methods):../../docs/BINARY/BINARY_SGEN.md
Architecture
Two-Phase Serialization
- Scan (
ScanPass.cs) — walks graph, detects multi-ref objects, builds reference table - Serialize (
BinarySerializationContext.cs) — writes binary using reference table
Generic over TOutput for strategy selection (ArrayBinaryOutput vs BufferWriterBinaryOutput).
Root Dispatch
Two root paths in AcBinarySerializer.Serialize<T>:
| Path | Condition | Dispatch depth |
|---|---|---|
| SGen fast | UseGeneratedCode + GeneratedWriter != null |
3 checks → WriteObject directly |
| Full runtime | No GeneratedWriter or UseGeneratedCode=false |
IQueryable → Expression → TryWritePrimitive → WriteValueNonPrimitive → WriteObject |
SGen fast path skips: is IQueryable, IsExpressionType, TryWritePrimitive (GetTypeCode + 15-case switch), WriteValueNonPrimitive (4 interface checks). Wire format identical. Details: ../../docs/BINARY/BINARY_SGEN.md.
Wire Format
BinaryTypeCode.cs — 100+ type markers:
| Range | Purpose |
|---|---|
| 0–63 | FixObj — compiled type slot indices |
| 64–71 | Complex — Object, ObjectRef, Array, Dictionary, ByteArray |
| 72–75 | Polymorphic — ObjectWithTypeName/TypeIndex (±RefFirst) |
| 76–90 | Primitives — Null, Bool, Int8–64, Float32–64, Decimal, Char |
| 91–94 | Strings — String, StringInterned, StringEmpty, StringInternFirst |
| 95–98 | Date/Time — DateTime, DateTimeOffset, TimeSpan, Guid |
| 99–102 | Other — Enum, Legacy, PropertySkip |
| 103–134 | FixStr — short strings (length in marker) |
| 144+ | Headers — Metadata, RefHandling, CacheCount |
| 192–255 | Tiny ints — single-byte -16..47 |
Full spec: docs/BINARY/BINARY_FORMAT.md
Key Files
Serialization
AcBinarySerializer.cs— entry point, context pool...BinarySerializationContext.cs— core logic, graph traversal, type writing...PropertyWriters.cs— per-type property write methods...BinarySerializationResult.cs— result wrapper...BinarySerializeTypeMetadata.cs— cached type metadata...ScanPass.cs— reference scanning
Deserialization
AcBinaryDeserializer.cs— entry point...BinaryDeserializationContext.cs— core logic...BinaryDeserializationContext.Read.cs— primitive reads...BinaryDeserializeTypeMetadata.cs— cached type metadata...CrossType.cs— schema evolution...Populate.cs— object population/merge
I/O
BinaryOutputBase.cs— output interfaceArrayBinaryOutput.cs— ArrayPool-backed, fastest forbyte[]BufferWriterBinaryOutput.cs— IBufferWriter-backed, zero-copy streaming. Context mode (serializer) + standalone mode (direct writes, e.g.AcBinaryHubProtocol)ArrayPooledBufferWriter.cs— concrete IBufferWriterIBinaryInputBase.cs/ArrayBinaryInput.cs/SequenceBinaryInput.cs— input strategies
Config & Types
AcBinarySerializerOptions.cs— options, presetsBinaryTypeCode.cs— wire format markersStringInterningMode.cs— None/Attribute/AllAcStringInternAttribute.cs— property-level interningTypeConversionInfo.cs— cross-type trackingBinaryPropertyFilterContext.cs— instance-dependent filtering
Property Handling
BinaryPropertyAccessorBase.cs/BinaryPropertySetterBase.cs
Source Generation
IGeneratedBinaryWriter.cs/IGeneratedBinaryReader.cs
Exceptions
AcBinaryDeserializationException.cs— rich exception with binary offset
Config Options
Key wire-format options: WireMode (Compact/Fast), ReferenceHandling (None/OnlyId/All), UseMetadata, UseStringInterning (None/Attribute/All), MaxDepth, UseCompression, PropertyFilter.
ReferenceHandling=None + UseStringInterning=None = no scan pass (single-phase, fastest).
Presets: Default, FastMode, ShallowCopy, WasmOptimized. Details: docs/BINARY/BINARY_OPTIONS.md.
Dependencies
- Base classes: parent
Serializers/(AcSerializerContextBase,TypeMetadataBase,IdentityMap) System.Buffers(ArrayPool, IBufferWriter)- LZ4 (optional compression)