diff --git a/AyCode.Core/Serializers/Binaries/AcBinaryDeserializer.BinaryDeserializationContext.cs b/AyCode.Core/Serializers/Binaries/AcBinaryDeserializer.BinaryDeserializationContext.cs
index 88de2d6..25fe89b 100644
--- a/AyCode.Core/Serializers/Binaries/AcBinaryDeserializer.BinaryDeserializationContext.cs
+++ b/AyCode.Core/Serializers/Binaries/AcBinaryDeserializer.BinaryDeserializationContext.cs
@@ -169,7 +169,7 @@ public static partial class AcBinaryDeserializer
///
/// Reads string intern footer: [dupCount][pos0][idx0][pos1][idx1]...
- /// Fixed int32 format for ultra-fast MemoryMarshal.Cast bulk read.
+ /// VarUInt format read into flat int[] for fast hot path access.
///
private void ReadFooterStringIndices(int footerPosition)
{
@@ -179,7 +179,7 @@ public static partial class AcBinaryDeserializer
// Seek to footer
_position = footerPosition;
- // Read dup count (still VarUInt for backward compat header)
+ // Read dup count
var dupCount = (int)ReadVarUInt();
if (dupCount == 0)
{
@@ -189,14 +189,14 @@ public static partial class AcBinaryDeserializer
}
else
{
- // Bulk read: dupCount * 2 int32s (position, cacheIndex pairs)
+ // Read VarUInt pairs into flat int[]
var intCount = dupCount * 2;
- var byteCount = intCount * sizeof(int);
- EnsureAvailable(byteCount);
-
_dupData = new int[intCount];
- MemoryMarshal.Cast(_buffer.Slice(_position, byteCount)).CopyTo(_dupData);
- _position += byteCount;
+ for (var i = 0; i < dupCount; i++)
+ {
+ _dupData[i * 2] = (int)ReadVarUInt(); // position
+ _dupData[i * 2 + 1] = (int)ReadVarUInt(); // cacheIndex
+ }
_internStringCache = new string[dupCount];
// Cache first dup position for ultra-fast hot path
diff --git a/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs b/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs
index ef5fd5a..c85c47f 100644
--- a/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs
+++ b/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs
@@ -237,7 +237,7 @@ public static partial class AcBinarySerializer
///
/// Writes the footer with (position, cacheIndex) pairs sorted by position.
- /// Fixed int32 format for ultra-fast MemoryMarshal.Cast bulk read in deserializer.
+ /// VarUInt format for compact size, deserializer reads into flat int[].
///
public void WriteInternedStringFooter()
{
@@ -261,17 +261,12 @@ public static partial class AcBinarySerializer
// Sort by StreamPosition (ascending) for deserializer sequential check
entries.Sort((a, b) => a.Position.CompareTo(b.Position));
- // Write pairs as fixed int32s: [pos0][idx0][pos1][idx1]...
- // This allows MemoryMarshal.Cast bulk read in deserializer
- var byteCount = _nextCacheIndex * 2 * sizeof(int);
- EnsureCapacity(byteCount);
- var dest = MemoryMarshal.Cast(_buffer.AsSpan(_position, byteCount));
+ // Write pairs as VarUInt for compact size
for (var i = 0; i < _nextCacheIndex; i++)
{
- dest[i * 2] = entries[i].Position;
- dest[i * 2 + 1] = entries[i].CacheIndex;
+ WriteVarUInt((uint)entries[i].Position);
+ WriteVarUInt((uint)entries[i].CacheIndex);
}
- _position += byteCount;
}
#endregion