public PresentationBuilder <TContract> UseSerializer(SerializationRule rule)
 {
     if (rule == null)
     {
         throw new ArgumentNullException(nameof(rule));
     }
     UserSerializationRules.Add(rule);
     return(this);
 }
        public static SerializationRule GetThrowsSerializationRuleFor <T>()
        {
            var fakeSerializer = new Mock <ISerializer>();

            fakeSerializer
            .Setup(s => s.Serialize(It.IsAny <object>(), It.IsAny <MemoryStream>()))
            .Callback(() => { throw new Exception("Fake exception"); });
            var throwsRule = new SerializationRule((t) => t == typeof(T), (t) => fakeSerializer.Object);

            return(throwsRule);
        }
Esempio n. 3
0
 public SerializationRuleTests()
 {
     target = new SerializationRule(true, ctor);
 }
Esempio n. 4
0
        public void Compile()
        {
            if (!globalContext.EnableClassesTypes)
            {
                if (type.IsClass)
                {
                    throw new ArgumentException($"Can't compile serialization functions for type {type}. To enable classes types use SMAB(enableClassesTypes = true) constructor");
                }
            }

            var serializeGen   = new ILGen <Action <SerializeStream, object, SerializationContext, SerializationMethodsBase[]> >(type + "_serialize", true);
            var deserializeGen = new ILGen <Func <SerializeStream, DeserializationContext, SerializationMethodsBase[], object> >(type + "_deserialize", true);

            SerializationRule typeRule = (SerializationRule)type.GetCustomAttribute(typeof(SerializationRule));
            bool defaultIsSerializable = typeRule != null ? typeRule.IsSerializable : true;

            ILVar optimizationResult = deserializeGen.DeclareVar(typeof((bool, object)));

            //Context optimization
            if (!type.IsValueType)
            {
                serializeGen.If(serializeGen.args[2].CallMethod(OptimizeSerializationContextMethodInfo, serializeGen.args[0], serializeGen.args[1]));
                serializeGen.Return();
                serializeGen.EndIf();


                deserializeGen.Line(optimizationResult.Set(deserializeGen.args[1].CallMethod(OptimizeDeserializationContextMethodInfo, deserializeGen.args[0])));
                deserializeGen.If(optimizationResult.Field(OptimizationResultItem1));
                deserializeGen.Return(optimizationResult.Field(OptimizationResultItem2));
                deserializeGen.EndIf();
            }

            ILVar serializeObject   = serializeGen.DeclareVar(type);
            ILVar deserializeObject = deserializeGen.DeclareVar(type);



            serializeGen.Line(serializeObject.Set(Expr.Cast(serializeGen.args[1], type)));
            deserializeGen.Line(deserializeObject.Set(Expr.CreateUninitialized(type)));

            if (!type.IsValueType)
            {
                deserializeGen.Line(deserializeGen.args[1].CallMethod(AddObjectDesreializationContextMethodInfo, deserializeObject));
            }

            foreach (FieldInfo fieldInfo in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).OrderBy((FieldInfo fieldInfo) => fieldInfo.MetadataToken))
            {
                SerializationRule fieldRule = (SerializationRule)fieldInfo.GetCustomAttribute(typeof(SerializationRule));
                if (!(fieldRule != null ? fieldRule.IsSerializable : defaultIsSerializable))
                {
                    continue;
                }

                Type fieldType = fieldInfo.FieldType;

                if (SerializeStream.GetBaseTypeRWMethodsIfExists(fieldType, out RWMethodsInfo rwMethods))
                {
                    serializeGen.Line(serializeGen.args[0].CallMethod(rwMethods.writeMethodInfo, serializeObject.Field(fieldInfo)));
                    deserializeGen.Line(deserializeObject.Field(fieldInfo).Set(deserializeGen.args[0].CallMethod(rwMethods.readMethodInfo)));
                }
                else
                {
                    int fieldTypeSerializationIndex = GetTypeSerializationMethodsIndex(fieldType);
                    serializeGen.Line(serializeGen.args[3].Index(Expr.Const(fieldTypeSerializationIndex)).CallMethod(SerializeMethodInfo, serializeGen.args[0], serializeObject.Field(fieldInfo), serializeGen.args[2]));
                    deserializeGen.Line(deserializeObject.Field(fieldInfo).Set(Expr.Cast(deserializeGen.args[2].Index(Expr.Const(fieldTypeSerializationIndex)).CallMethod(DeserializeMethodInfo, serializeGen.args[0], serializeGen.args[1]), fieldType)));
                }
            }

            deserializeGen.Return(deserializeObject);

            serializationMethods.TypeSerializeMethod   = new SerializationMethodsWithDependencies.SerializeMethod(serializeGen.compile(globalContext.WithComments));
            serializationMethods.TypeDeserializeMethod = new SerializationMethodsWithDependencies.DeserializeMethod(deserializeGen.compile(globalContext.WithComments));
        }