public int Serialize(ref byte[] bytes, int offset, Double value, IFormatterResolver formatterResolver)
 {
     return(MessagePackBinary.WriteDouble(ref bytes, offset, value));
 }
 public Double Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize)
 {
     return(MessagePackBinary.ReadDouble(bytes, offset, out readSize));
 }
예제 #3
0
 public int Serialize(ref byte[] bytes, int offset, IGrouping<TKey, TElement> value, IFormatterResolver formatterResolver)
 {
     if (value == null)
     {
         return MessagePackBinary.WriteNil(ref bytes, offset);
     }
     else
     {
         var startOffset = offset;
         offset += MessagePackBinary.WriteArrayHeader(ref bytes, offset, 2);
         offset += formatterResolver.GetFormatterWithVerify<TKey>().Serialize(ref bytes, offset, value.Key, formatterResolver);
         offset += formatterResolver.GetFormatterWithVerify<IEnumerable<TElement>>().Serialize(ref bytes, offset, value, formatterResolver);
         return offset - startOffset;
     }
 }
 /// <summary>
 /// Dump to JSON string.
 /// </summary>
 public static string ToJson <T>(T obj, IFormatterResolver resolver)
 {
     return(ToJson(Serialize(obj, resolver)));
 }
 public int Serialize(ref byte[] bytes, int offset, LockoutEndDateChanged value, IFormatterResolver formatterResolver)
 {
     if (value.LockoutEnd == null)
     {
         return(MessagePackBinary.WriteNil(ref bytes, offset));
     }
     return(MessagePackBinary.WriteDateTime(ref bytes, offset, value.LockoutEnd.Value.UtcDateTime));
 }
예제 #6
0
        public int Serialize(ref byte[] bytes, int offset, TCollection value, IFormatterResolver formatterResolver)
        {
            if (value == null)
            {
                return MessagePackBinary.WriteNil(ref bytes, offset);
            }
            else
            {
                // Optimize iteration(array is fastest)
                var array = value as TElement[];
                if (array != null)
                {
                    var startOffset = offset;
                    var formatter = formatterResolver.GetFormatterWithVerify<TElement>();

                    offset += MessagePackBinary.WriteArrayHeader(ref bytes, offset, array.Length);

                    foreach (var item in array)
                    {
                        offset += formatter.Serialize(ref bytes, offset, item, formatterResolver);
                    }

                    return offset - startOffset;
                }
                else
                {
                    var startOffset = offset;
                    var formatter = formatterResolver.GetFormatterWithVerify<TElement>();

                    // knows count or not.
                    var seqCount = GetCount(value);
                    if (seqCount != null)
                    {
                        offset += MessagePackBinary.WriteArrayHeader(ref bytes, offset, seqCount.Value);

                        // Unity's foreach struct enumerator causes boxing so iterate manually.
                        var e = GetSourceEnumerator(value);
                        try
                        {
                            while (e.MoveNext())
                            {
#if NETSTANDARD
                                offset += formatter.Serialize(ref bytes, offset, e.Current, formatterResolver);
#else
                                offset += formatter.Serialize(ref bytes, (int)offset, (TElement)e.Current, (IFormatterResolver)formatterResolver);
#endif
                            }
                        }
                        finally
                        {
                            e.Dispose();
                        }

                        return offset - startOffset;
                    }
                    else
                    {
                        // write message first -> open header space -> write header
                        var writeStarOffset = offset;

                        var count = 0;
                        var moveCount = 0;

                        // count = 16 <= 65535, header len is "3" so choose default space.
                        offset += 3;

                        var e = GetSourceEnumerator(value);
                        try
                        {
                            while (e.MoveNext())
                            {
                                count++;
#if NETSTANDARD
                                var writeSize = formatter.Serialize(ref bytes, offset, e.Current, formatterResolver);
#else
                                var writeSize = formatter.Serialize(ref bytes, (int)offset, (TElement)e.Current, (IFormatterResolver)formatterResolver);
#endif
                                moveCount += writeSize;
                                offset += writeSize;
                            }
                        }
                        finally
                        {
                            e.Dispose();
                        }

                        var headerLength = MessagePackBinary.GetArrayHeaderLength(count);
                        if (headerLength != 3)
                        {
                            if (headerLength == 1) offset -= 2; // 1
                            else offset += 2; // 5

                            MessagePackBinary.EnsureCapacity(ref bytes, offset, headerLength);
                            Buffer.BlockCopy(bytes, writeStarOffset + 3, bytes, writeStarOffset + headerLength, moveCount);
                        }
                        MessagePackBinary.WriteArrayHeader(ref bytes, writeStarOffset, count);

                        return offset - startOffset;
                    }
                }
            }
        }
예제 #7
0
 public static void RegisterDefaultResolver(params IFormatterResolver[] resolvers)
 {
     CompositeResolver.Register(resolvers);
     defaultResolver = CompositeResolver.Instance;
 }
        //// see:http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx
        //// subtract Version, Culture and PublicKeyToken from AssemblyQualifiedName
        //static string BuildTypeName(Type type)
        //{
        //    if (RemoveAssemblyVersion)
        //    {
        //        string full = type.AssemblyQualifiedName;

        //        var shortened = SubtractFullNameRegex.Replace(full, "");
        //        if (Type.GetType(shortened, false) == null)
        //        {
        //            // if type cannot be found with shortened name - use full name
        //            shortened = full;
        //        }

        //        return shortened;
        //    }
        //    else
        //    {
        //        return type.AssemblyQualifiedName;
        //    }
        //}

        public int Serialize(ref byte[] bytes, int offset, object value, IFormatterResolver formatterResolver)
        {
            if (value == null)
            {
                return(MessagePackBinary.WriteNil(ref bytes, offset));
            }

            var type = value.GetType();

            Type expectedType;

            byte[] typeName;
            if (typeNameCache.TryGetValue(type, out var typeAndName))
            {
                expectedType = typeAndName.Key;
                typeName     = typeAndName.Value;
            }
            else
            {
                if (blacklistCheck.Contains(type.FullName))
                {
                    ThrowHelper.ThrowInvalidOperationException_Blacklist(type);
                }

                if (type.IsAnonymous() || useBuiltinTypes.Contains(type))
                {
                    typeName     = null;
                    expectedType = null;
                }
                else
                {
                    typeName = TranslateTypeName(type, out expectedType);
                }
                typeNameCache.TryAdd(type, new KeyValuePair <Type, byte[]>(expectedType, typeName));
            }

            if (typeName == null)
            {
                return(Resolvers.TypelessFormatterFallbackResolver.Instance.GetFormatter <object>().Serialize(ref bytes, offset, value, formatterResolver));
            }

            // don't use GetOrAdd for avoid closure capture.
            if (!serializers.TryGetValue(expectedType, out var formatterAndDelegate))
            {
                lock (serializers) // double check locking...
                {
                    if (!serializers.TryGetValue(expectedType, out formatterAndDelegate))
                    {
                        var formatter = formatterResolver.GetFormatterDynamic(expectedType);
                        if (formatter == null)
                        {
                            ThrowHelper.ThrowFormatterNotRegisteredException(expectedType, formatterResolver);
                        }

                        var formatterType = typeof(IMessagePackFormatter <>).GetCachedGenericType(expectedType);
                        var param0        = Expression.Parameter(typeof(object), "formatter");
                        var param1        = Expression.Parameter(typeof(byte[]).MakeByRefType(), "bytes");
                        var param2        = Expression.Parameter(typeof(int), "offset");
                        var param3        = Expression.Parameter(typeof(object), "value");
                        var param4        = Expression.Parameter(typeof(IFormatterResolver), "formatterResolver");

                        var serializeMethodInfo = formatterType.GetRuntimeMethod("Serialize", new[] { typeof(byte[]).MakeByRefType(), typeof(int), expectedType, typeof(IFormatterResolver) });

                        var body = Expression.Call(
                            Expression.Convert(param0, formatterType),
                            serializeMethodInfo,
                            param1,
                            param2,
                            expectedType.IsValueType ? Expression.Unbox(param3, expectedType) : Expression.Convert(param3, expectedType),
                            param4);

                        var lambda = Expression.Lambda <SerializeMethod>(body, param0, param1, param2, param3, param4).Compile();

                        formatterAndDelegate = new KeyValuePair <object, SerializeMethod>(formatter, lambda);
                        serializers.TryAdd(expectedType, formatterAndDelegate);
                    }
                }
            }

            // mark as extension with code 100
            var startOffset = offset;

            offset += 6; // mark will be written at the end, when size is known
            offset += MessagePackBinary.WriteStringBytes(ref bytes, offset, typeName);
            offset += formatterAndDelegate.Value(formatterAndDelegate.Key, ref bytes, offset, value, formatterResolver);
            MessagePackBinary.WriteExtensionFormatHeaderForceExt32Block(ref bytes, startOffset, ExtensionTypeCode, offset - startOffset - 6);
            return(offset - startOffset);
        }
예제 #9
0
 public static T Create(CallInvoker invoker, IFormatterResolver resolver)
 {
     return(consturtor(invoker, resolver));
 }
예제 #10
0
 public static T Create <T>(CallInvoker invoker, IFormatterResolver resolver)
     where T : IService <T>
 {
     return(MagicOnionClientRegistry <T> .Create(invoker, resolver));
 }
예제 #11
0
 public static T Create <T>(Channel channel, IFormatterResolver resolver)
     where T : IService <T>
 {
     return(Create <T>(new DefaultCallInvoker(channel), resolver));
 }
예제 #12
0
        protected virtual int SerializeBody(ref byte[] bytes, int offset, T instance, IFormatterResolver formatterResolver)
        {
            // [typeIndex, [members], [members], [members]]
            var startOffset = offset;

            var meta = DarkMeta.Get(instance.GetType());

            if (meta.Flags.IsStatic())
            {
                offset += MessagePackBinary.WriteArrayHeader(ref bytes, offset, meta.DeepLevel);
            }
            else
            {
                offset += MessagePackBinary.WriteArrayHeader(ref bytes, offset, meta.DeepLevel + 1);
                offset += MessagePackBinary.WriteInt32(ref bytes, offset, (int)meta.TypeIndex);

                if (meta.TypeIndex == TypeIndex.Invalid)
                {
                    var message = String.Format("Type index is invalid at {0} ", instance.ToString());
                    Logger.Instance.Error(message);
                }
            }
            offset += meta.WriteMembers(Serializer.Instance.State.Settings.Flags, instance, ref bytes, offset, formatterResolver);
            return(offset - startOffset);
        }
예제 #13
0
        protected virtual T DeserializeBody(Type type, int elementsCount, byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize)
        {
            // ...[members], [members], [members]...
            var meta     = DarkMeta.Get(type);
            var instance = meta.CreateInstance();

            Serializer.Instance.State.ObjectInstances.Add(instance);
            meta.ReadMembers(Serializer.Instance.State.Settings.Flags, ref instance, bytes, offset, formatterResolver, out readSize);
            return((T)instance);
        }