private void EmitFieldSerializer(SerializerInfo writer, Action LdTarget, Action LdAddress, Action LdValue)
            {
                bool isBasic = writer.IsBasic;

                if (isBasic)
                {
                    Ldarg(0);
                    LdTarget();
                    LdAddress();
                    Callvirt(writer.Method);
                }
                else
                {
                    bool isClass = writer.IsClass;
                    if (isClass)
                    {
                        Ldarg(0);
                        LdTarget();
                        LdValue();
                        Call(writer.Method);
                    }
                    else
                    {
                        Ldarg(0);
                        LdTarget();
                        LdAddress();
                        Call(writer.Method);
                    }
                }
            }
            private void EmitFieldDeserializer(SerializerInfo reader, Action LdTarget, Action LdAddress, Action StValue)
            {
                bool isBasic = reader.IsBasic;

                if (isBasic)
                {
                    Ldarg(0);
                    LdTarget();
                    LdAddress();
                    Callvirt(reader.Method);
                }
                else
                {
                    bool isClass = reader.IsClass;
                    if (isClass)
                    {
                        LdTarget();
                        Ldarg(0);
                        Call(reader.Method);
                        StValue();
                    }
                    else
                    {
                        Ldarg(0);
                        LdTarget();
                        LdAddress();
                        Call(reader.Method);
                    }
                }
            }
        private static SerializerInfo GetSerializerInfo(Type type, IEnumerable <Type> knownTypes)
        {
            SerializerInfo info = new SerializerInfo();

            info.ObjectType = type;

            info.XmlSerializer = new DataContractSerializer(type, knownTypes);
            return(info);
        }
        /// <summary>
        /// Serializes an unknown object type.
        /// </summary>
        /// <typeparam name="T">The type of the object. This may not reflect the exact object type.</typeparam>
        /// <param name="value">The object value.</param>
        /// <returns>The serialized <see cref="JToken"/>.</returns>
        protected virtual JToken SerializeUnknown <T>(T value)
        {
            if (ReferenceEquals(value, null))
            {
                return(null);
            }

            var mySerializers = _mySerializers;

            if (mySerializers == null)
            {
                Thread.MemoryBarrier();
                mySerializers  = _serializers.GetOrAdd(GetType().TypeHandle, th => new SerializerInfo(Type.GetTypeFromHandle(th)));
                _mySerializers = mySerializers;
            }

            return(_mySerializers.Serialize(this, value));
        }
Example #5
0
        /// <summary>
        /// Serializes an unknown object type.
        /// </summary>
        /// <typeparam name="T">The type of the object. This may not reflect the exact object type.</typeparam>
        /// <param name="value">The object value.</param>
        /// <returns>The serialized <see cref="JsonValue"/>.</returns>
        protected virtual JsonValue SerializeUnknown <T>(T value)
        {
#pragma warning disable S1168 // Empty arrays and collections should be returned instead of null
            // Null is significant in JSON.

            if (ReferenceEquals(value, null))
            {
                return(null);
            }
#pragma warning restore S1168 // Empty arrays and collections should be returned instead of null

            var mySerializers = _mySerializers;
            if (mySerializers == null)
            {
                Thread.MemoryBarrier();
                mySerializers  = _serializers.GetOrAdd(GetType().TypeHandle, th => new SerializerInfo(Type.GetTypeFromHandle(th)));
                _mySerializers = mySerializers;
            }

            return(_mySerializers.Serialize(this, value));
        }
        private static SerializerInfo GetSerializerInfo(Type type, IEnumerable<Type> knownTypes)
        {
            SerializerInfo info = new SerializerInfo();
            info.ObjectType = type;

            info.XmlSerializer = new DataContractSerializer(type, knownTypes);
            return info;
        }
 internal MissingDeserializerInfo(Snapshot snapshot, SerializerInfo serializerInfo)
 {
     _snapshot       = snapshot;
     _serializerInfo = serializerInfo;
 }
            private Deserializer(Type t) : base(t)
            {
                bool canSerializeNull = CanSerializeNull;

                if (canSerializeNull)
                {
                    Target target = DefineLabel();
                    Ldarg(0);
                    Callvirt(ReadNull);
                    Brfalse(target);
                    bool isClass = T.IsClass;
                    if (isClass)
                    {
                        Ldnull();
                        Ret();
                    }
                    else
                    {
                        Ldarg(1);
                        Initobj(T);
                        Ret();
                    }
                    MarkLabel(target);
                }
                bool isNullable = IsNullable;

                if (isNullable)
                {
                    FieldInfo      f      = T.GetFieldPrivate("value");
                    SerializerInfo reader = GetReader(f.FieldType);
                    EmitFieldDeserializer(reader, delegate
                    {
                        Ldarg(1);
                    }, delegate
                    {
                        Ldflda(f);
                    }, delegate
                    {
                        Stfld(f);
                    });
                    Ldarg(1);
                    Ldc(1);
                    Stfld(T.GetFieldPrivate("hasValue"));
                    Ret();
                }
                else
                {
                    bool isArray = T.IsArray;
                    if (isArray)
                    {
                        var            elementType = T.GetElementType();
                        SerializerInfo reader2     = GetReader(elementType);
                        SerializerCall(ReadOpenArray);
                        Local local = DeclareLocal <int>(false);
                        Ldarg(0);
                        Ldloca(local);
                        Callvirt(ReadInt32);
                        var target = DeclareLocal(T, false);
                        Ldloc(local);
                        Newarr(elementType);
                        Stloc(target);
                        using (IndexLoop loop = Loop(local))
                        {
                            EmitFieldDeserializer(reader2
                                                  , LdTarget: () =>
                            {
                                Ldloc(target);
                                Ldloc(loop.Index);
                            }
                                                  , LdAddress: () =>
                            {
                                Ldelema(elementType);
                            }
                                                  , StValue: () =>
                            {
                                Stelem(ObjectReference);
                            });
                        }
                        SerializerCall(ReadCloseArray);
                        Ldloc(target);
                        Ret();
                    }
                    else
                    {
                        bool isClass2 = T.IsClass;
                        if (isClass2)
                        {
                            var target = DeclareLocal(T, false);
                            Newobj(T);
                            Stloc(target);
                            SerializerCall(ReadOpenObject);
                            FieldInfo[] fields = T.GetFields();
                            for (int i = 0; i < fields.Length; i++)
                            {
                                FieldInfo      f3        = fields[i];
                                FieldInfo      f         = f3;
                                SerializerInfo reader3   = GetReader(f.FieldType);
                                SerializerInfo arg_36B_1 = reader3;
                                EmitFieldDeserializer(arg_36B_1
                                                      , LdTarget: () => { Ldloc(target); }
                                                      , LdAddress: () => { Ldflda(f); }
                                                      , StValue: () => { Stfld(f); });
                            }
                            SerializerCall(ReadCloseObject);
                            Ldloc(target);
                            Ret();
                        }
                        else
                        {
                            SerializerCall(ReadOpenObject);
                            FieldInfo[] fields2 = T.GetFields();
                            for (int j = 0; j < fields2.Length; j++)
                            {
                                FieldInfo      f2      = fields2[j];
                                FieldInfo      f       = f2;
                                SerializerInfo reader4 = GetReader(f.FieldType);
                                EmitFieldDeserializer(reader4, delegate
                                {
                                    Ldarg(1);
                                }, delegate
                                {
                                    Ldflda(f);
                                }, delegate
                                {
                                    Stfld(f);
                                });
                            }
                            SerializerCall(ReadCloseObject);
                            Ret();
                        }
                    }
                }
            }
            private Serializer(Type t) : base(t)
            {
                bool canSerializeNull = CanSerializeNull;

                if (canSerializeNull)
                {
                    bool isClass = T.IsClass;
                    if (isClass)
                    {
                        Ldarg(1);
                    }
                    else
                    {
                        Ldarg(1);
                        Ldfld(T.GetFieldPrivate("hasValue"));
                    }
                    Target target = DefineLabel();
                    Brtrue(target);
                    Ldarg(0);
                    Callvirt(WriteNull);
                    Ret();
                    MarkLabel(target);
                }
                bool isNullable = IsNullable;

                if (isNullable)
                {
                    FieldInfo      f      = T.GetFieldPrivate("value");
                    SerializerInfo writer = GetWriter(f.FieldType);
                    EmitFieldSerializer(writer
                                        , LdTarget: () => Ldarg(1)
                                        , LdAddress: () => Ldflda(f)
                                        , LdValue: () => Ldfld(f)
                                        );
                    Ret();
                }
                else
                {
                    bool isArray = T.IsArray;
                    if (isArray)
                    {
                        var            elementType = T.GetElementType();
                        SerializerInfo writer2     = GetWriter(elementType);
                        SerializerCall(WriteOpenArray);
                        Local local = DeclareLocal(typeof(int), false);
                        Ldarg(1);
                        Ldlen();
                        Conv <int>(false, true);
                        Stloc(local);
                        Ldarg(0);
                        Ldloca(local);
                        Callvirt(WriteInt32);
                        using (IndexLoop loop = Loop(local))
                        {
                            this.EmitFieldSerializer(writer2
                                                     , LdTarget: () =>
                            {
                                Ldarg(1);
                                Ldloc(loop.Index);
                            }
                                                     , LdAddress: () =>
                            {
                                Ldelema(elementType);
                            }
                                                     , LdValue: delegate
                            {
                                Ldelem(ObjectReference);
                            });
                        }
                        SerializerCall(WriteCloseArray);
                        Ret();
                    }
                    else
                    {
                        SerializerCall(WriteOpenObject);
                        FieldInfo[] fields = T.GetFields();
                        for (int i = 0; i < fields.Length; i++)
                        {
                            FieldInfo      f2      = fields[i];
                            FieldInfo      f       = f2;
                            SerializerInfo writer3 = GetWriter(f.FieldType);
                            EmitFieldSerializer(writer3, delegate
                            {
                                Ldarg(1);
                            }, delegate
                            {
                                Ldflda(f);
                            }, delegate
                            {
                                Ldfld(f);
                            });
                        }
                        SerializerCall(WriteCloseObject);
                        Ret();
                    }
                }
            }
Example #10
0
 private bool ExistsDeserializerFor(SerializerInfo serializerInfo)
 {
     return(_deserializers.ContainsKey(serializerInfo.Key));
 }
Example #11
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SerializeeInfo"/> class.
 /// </summary>
 /// <param name="serializeeType">Type of the serializee.</param>
 /// <param name="serializerInfo">Information about the serializer handling the serializee.</param>
 /// <param name="serializer">The external object serializer instance.</param>
 public SerializeeInfo(Type serializeeType, SerializerInfo serializerInfo, IExternalObjectSerializer serializer)
 {
     SerializeeType = serializeeType;
     SerializerInfo = serializerInfo;
     Serializer     = serializer;
 }