Esempio n. 1
0
        public void WriteRaw(byte[] rawValue)
        {
#if NETSTANDARD
            UnsafeMemory.WriteRaw(ref this, rawValue);
#else
            BinaryUtil.EnsureCapacity(ref buffer, offset, rawValue.Length);
            Buffer.BlockCopy(rawValue, 0, buffer, offset, rawValue.Length);
            offset += rawValue.Length;
#endif
        }
 public void Serialize(ref MessagePackWriter writer, ref int idx, CultureInfo value, IFormatterResolver formatterResolver)
 {
     if (value != null)
     {
         var encodedBytes = MessagePackBinary.GetEncodedStringBytes(value.Name);
         UnsafeMemory.WriteRaw(ref writer, encodedBytes, ref idx);
         return;
     }
     writer.WriteNil(ref idx);
 }
Esempio n. 3
0
        public void Serialize(ref MessagePackWriter writer, ref int idx, T value, IFormatterResolver formatterResolver)
        {
            if (!valueNameMapping.TryGetValue(value, out string name))
            {
                name = value.ToString(); // fallback for flags etc, But Enum.ToString is too slow.
            }

            var encodedName = MessagePackBinary.GetEncodedStringBytes(name);

            UnsafeMemory.WriteRaw(ref writer, encodedName, ref idx);
        }
        static void SerializeWithLengthPrefixExt <T>(Stream stream, T data, IFormatterResolver resolver)
        {
            const int ExtTypeCode = 111; // sample ext code

            var serializedData = MessagePackSerializer.Serialize(data, resolver);
            var tmp            = MessagePackSerializer.Deserialize <T>(serializedData, resolver);

            var dataSize = serializedData.Length;
            var idx      = 0;
            var writer   = new MessagePackWriter(16);

            var headerLength = MessagePackBinary.GetExtensionFormatHeaderLength(dataSize);

            writer.Ensure(idx, headerLength + dataSize);
            writer.WriteExtensionFormatHeader(ExtTypeCode, dataSize, ref idx);
            UnsafeMemory.WriteRaw(ref writer, serializedData, ref idx);
            var buffer = writer.ToArray(idx);

            stream.Write(buffer);
        }
        public void Serialize(ref MessagePackWriter writer, ref int idx, object value, IFormatterResolver formatterResolver)
        {
            if (value == null)
            {
                writer.WriteNil(ref idx); return;
            }

            var type = value.GetType();

            if (!s_typeNameCache.TryGetValue(type, out Type expectedType))
            {
                GetExpectedTypeSlow(type, out expectedType);
            }

            if (expectedType == null)
            {
                Resolvers.TypelessFormatterFallbackResolver.Instance.GetFormatter <object>().Serialize(ref writer, ref idx, value, formatterResolver);
                return;
            }

            // don't use GetOrAdd for avoid closure capture.
            if (!s_serializers.TryGetValue(expectedType, out var formatterAndDelegate))
            {
                GetFormatterAndDelegateSlow(expectedType, formatterResolver, out formatterAndDelegate);
            }

            // mark as extension with code 100
            writer.Ensure(idx, 6);
            var startOffset = idx;

            idx += 6; // mark will be written at the end, when size is known

            var typeName = MessagePackBinary.GetEncodedTypeName(expectedType);

            UnsafeMemory.WriteRaw(ref writer, typeName, ref idx);
            formatterAndDelegate.Value(formatterAndDelegate.Key, ref writer, ref idx, value, formatterResolver);

            var dataLength = idx - startOffset - 6;

            MessagePackBinary.WriteExtensionFormatHeaderForceExt32Block(ref writer.PinnableAddress, startOffset, ExtensionTypeCode, dataLength);
        }
 public void WriteRaw(MemoryStream ms) => UnsafeMemory.WriteRaw(ref this, ms);
 public void WriteRaw(byte[] rawValue, int length) => UnsafeMemory.WriteRaw(ref this, rawValue, length);
 public void WriteRaw(byte[] rawValue) => UnsafeMemory.WriteRaw(ref this, rawValue);