diff --git a/AyCode.Core.Serializers.Console/AyCode.Core.Serializers.Console.csproj b/AyCode.Core.Serializers.Console/AyCode.Core.Serializers.Console.csproj index 352bf54..4c4bf12 100644 --- a/AyCode.Core.Serializers.Console/AyCode.Core.Serializers.Console.csproj +++ b/AyCode.Core.Serializers.Console/AyCode.Core.Serializers.Console.csproj @@ -16,8 +16,6 @@ net9.0 enable enable - - true true false + + true diff --git a/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs b/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs index f2c8bf2..07d6ec5 100644 --- a/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs +++ b/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs @@ -699,21 +699,25 @@ public static partial class AcBinarySerializer public void WriteFixStrDirect(string value) { - var length = value.Length; - EnsureCapacity(1 + length); - - var destSpan = _buffer.AsSpan(_position + 1, length); - var status = Ascii.FromUtf16(value.AsSpan(), destSpan, out var bytesWritten); - - if (status == OperationStatus.Done && bytesWritten == length) + // Compute UTF-8 byte count up front. FixStr opcode encodes byte count (5-bit field, ≤31). + // For ASCII: byte count = char count; for non-ASCII: byte count > char count. + // Bonus over the prior ASCII-only path: short non-ASCII strings (e.g. 8-char Hungarian + // ≈ 12 bytes) now also fit in FixStr and save the String-marker + VarUInt overhead. + var byteCount = Utf8NoBom.GetByteCount(value); + if (byteCount <= BinaryTypeCode.FixStrMaxLength) { - _buffer[_position] = BinaryTypeCode.EncodeFixStr(length); - _position += 1 + length; + EnsureCapacity(1 + byteCount); + _buffer[_position++] = BinaryTypeCode.EncodeFixStr(byteCount); + Utf8NoBom.GetBytes(value.AsSpan(), _buffer.AsSpan(_position, byteCount)); + _position += byteCount; } else { _buffer[_position++] = BinaryTypeCode.String; - WriteStringUtf8Internal(value); + EnsureCapacity(VarUIntSize((uint)byteCount) + byteCount); + WriteVarUIntUnsafe((uint)byteCount); + Utf8NoBom.GetBytes(value.AsSpan(), _buffer.AsSpan(_position, byteCount)); + _position += byteCount; } }