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;
}
}