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 void WriteField(Writer writer, SerializerSession session, uint fieldIdDelta, Type expectedType, Dictionary <TKey, TValue> value) { if (ReferenceCodec.TryWriteReferenceField(writer, session, fieldIdDelta, expectedType, value)) { return; } writer.WriteFieldHeader(session, fieldIdDelta, expectedType, value.GetType(), WireType.TagDelimited); if (value.Comparer != EqualityComparer <TKey> .Default) { this.comparerCodec.WriteField(writer, session, 0, typeof(IEqualityComparer <TKey>), value.Comparer); } var first = true; foreach (var element in value) { this.pairCodec.WriteField(writer, session, first ? 1U : 0, typeof(KeyValuePair <TKey, TValue>), element); first = false; } writer.WriteEndObject(); }
void IFieldCodec <Dictionary <TKey, TValue> > .WriteField <TBufferWriter>(ref Writer <TBufferWriter> writer, uint fieldIdDelta, Type expectedType, Dictionary <TKey, TValue> value) { if (ReferenceCodec.TryWriteReferenceField(ref writer, fieldIdDelta, expectedType, value)) { return; } writer.WriteFieldHeader(fieldIdDelta, expectedType, value.GetType(), WireType.TagDelimited); if (value.Comparer != EqualityComparer <TKey> .Default) { this.comparerCodec.WriteField(ref writer, 0, typeof(IEqualityComparer <TKey>), value.Comparer); } var first = true; foreach (var element in value) { this.pairCodec.WriteField(ref writer, first ? 1U : 0, typeof(KeyValuePair <TKey, TValue>), element); first = false; } writer.WriteEndObject(); }
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, typeof(string), WireType.LengthPrefixed); #if NETCOREAPP var numBytes = Encoding.UTF8.GetByteCount(value); writer.WriteVarInt((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.WriteVarInt((uint)bytes.Length); writer.Write(bytes); #endif }