/// <inheritdoc/> public void WriteField <TBufferWriter>(ref Writer <TBufferWriter> writer, uint fieldIdDelta, Type expectedType, TField value) where TBufferWriter : IBufferWriter <byte> { if (ReferenceCodec.TryWriteReferenceField(ref writer, fieldIdDelta, expectedType, value)) { return; } var fieldType = value.GetType(); if (fieldType == CodecFieldType) { writer.WriteStartObject(fieldIdDelta, expectedType, fieldType); TSurrogate surrogate = default; ConvertToSurrogate(value, ref surrogate); _surrogateSerializer.Serialize(ref writer, ref surrogate); writer.WriteEndObject(); } else { SerializeUnexpectedType(ref writer, fieldIdDelta, expectedType, value, fieldType); } }
public static void WriteField <TBufferWriter>(ref Writer <TBufferWriter> writer, uint fieldIdDelta, Type expectedType, string value) where TBufferWriter : IBufferWriter <byte> { if (ReferenceCodec.TryWriteReferenceField(ref writer, fieldIdDelta, expectedType, value)) { return; } writer.WriteFieldHeader(fieldIdDelta, expectedType, CodecFieldType, WireType.LengthPrefixed); #if NETCOREAPP3_1_OR_GREATER var numBytes = Encoding.UTF8.GetByteCount(value); writer.WriteVarUInt32((uint)numBytes); if (numBytes < 512) { writer.EnsureContiguous(numBytes); } var currentSpan = writer.WritableSpan; // If there is enough room in the current span for the encoded data, // then encode directly into the output buffer. if (numBytes <= currentSpan.Length) { Encoding.UTF8.GetBytes(value, currentSpan); writer.AdvanceSpan(numBytes); } else { // Note: there is room for optimization here. Span <byte> bytes = Encoding.UTF8.GetBytes(value); writer.Write(bytes); } #else var bytes = Encoding.UTF8.GetBytes(value); writer.WriteVarUInt32((uint)bytes.Length); writer.Write(bytes); #endif }