From 80235c9a3d20395d100dee194eb344a562c4d991 Mon Sep 17 00:00:00 2001 From: Loretta Date: Mon, 4 May 2026 07:02:13 +0200 Subject: [PATCH] [LOADED_DOCS: 2 files, no new loads] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Support FixStr for short non-ASCII strings (UTF-8) Refactored WriteFixStrDirect to encode short non-ASCII strings as FixStr if their UTF-8 byte count is ≤31, not just ASCII. This improves efficiency for short international strings. Also ensured correct buffer sizing and direct UTF-8 encoding. No functional change to project file; property repositioned for clarity. --- .../AyCode.Core.Serializers.Console.csproj | 4 ++-- ...rySerializer.BinarySerializationContext.cs | 24 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) 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; } }