Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        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();
        }
Esempio n. 4
0
        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
        }