예제 #1
0
        private ObjectReader CreateReader(Stream stream)
        {
            ReadMethods readMethods = new ReadMethods();

            if (settings.DeserializationMethod == Method.Generated)
            {
                readMethods.readMethodsProvider = new DynamicMethodProvider <ReadMethodDelegate>(t =>
                {
                    var generator = new ReadMethodGenerator(t, settings.DisableTypeStamping, settings.TreatCollectionAsUserObject);
                    return(generator.Generate());
                });

                readMethods.touchInlinedObjectMethodsProvider = new DynamicMethodProvider <TouchInlinedObjectMethodDelegate>(t =>
                {
                    if (recipes.TryGetValue(t, out var recipe))
                    {
                        return((or, objectId) => or.ReadRecipe(objectId, recipe));
                    }

                    var generator = new TouchInlinedObjectGenerator(t, settings.DisableTypeStamping, settings.TreatCollectionAsUserObject);
                    return(generator.Generate());
                });

                readMethods.completeMethodsProvider = new DynamicMethodProvider <CompleteMethodDelegate>(t =>
                {
                    var generator = new CompletedGenerator(t, objectsForSurrogates, settings.DisableTypeStamping, settings.TreatCollectionAsUserObject, OnPostDeserialization != null);
                    return(generator.Generate());
                });

                readMethods.createObjectMethodsProvider = new DynamicMethodProvider <CreateObjectMethodDelegate>(t =>
                {
                    var generator = new CreateObjectGenerator(t, settings.DisableTypeStamping, settings.TreatCollectionAsUserObject);
                    return(generator.Generate());
                });

                readMethods.cloneContentMehtodsProvider = new DynamicMethodProvider <CloneMethodDelegate>(t =>
                {
                    if (t.IsValueType)
                    {
                        return(ObjectReader.CloneContentUsingReflection);
                    }
                    var generator = new CloneContentMethodGenerator(t);
                    return(generator.Generate());
                });

                readMethods.addHashCodeBasedDeferredElementProvider = new DynamicMethodProvider <AddDeferredHashCodeBasedElementDelegate>(t =>
                {
                    var generator = new AddDeferredElementToHashCodeBasedMethodGenerator(t);
                    return(generator.Generate());
                });
            }
            else
            {
                readMethods = GetReflectionBasedReadMethods(settings.TreatCollectionAsUserObject);
            }

            return(new ObjectReader(stream, readMethods, objectsForSurrogates, recipes, OnPostDeserialization,
                                    settings.TreatCollectionAsUserObject, settings.VersionTolerance, settings.UseBuffering,
                                    settings.DisableTypeStamping, settings.ReferencePreservation, settings.ForceStampVerification));
        }
예제 #2
0
 private void EnsureReadMethod(Type type)
 {
     if (!readMethodsCache.ContainsKey(type))
     {
         var rmg = new ReadMethodGenerator(type, stamper, treatCollectionAsUserObject);
         readMethodsCache.Add(type, rmg.Method);
     }
 }
예제 #3
0
 private void EnsureReadMethod(Type type)
 {
     if (!readMethodsCache.ContainsKey(type))
     {
         var rmg = new ReadMethodGenerator(type, stamper);
         readMethodsCache.Add(type, rmg.Method);
     }
 }
예제 #4
0
 private void TouchReadMethod(Type type)
 {
     if (!readMethodsCache.ContainsKey(type))
     {
         var surrogateId = Helpers.GetSurrogateFactoryIdForType(type, objectsForSurrogates);
         var rmg         = new ReadMethodGenerator(type, treatCollectionAsUserObject, surrogateId,
                                                   Helpers.GetFieldInfo <ObjectReader, InheritanceAwareList <Delegate> >(x => x.objectsForSurrogates),
                                                   Helpers.GetFieldInfo <ObjectReader, AutoResizingList <object> >(x => x.deserializedObjects),
                                                   Helpers.GetFieldInfo <ObjectReader, PrimitiveReader>(x => x.reader),
                                                   Helpers.GetFieldInfo <ObjectReader, Action <object> >(x => x.postDeserializationCallback),
                                                   Helpers.GetFieldInfo <ObjectReader, List <Action> >(x => x.postDeserializationHooks));
         readMethodsCache.Add(type, rmg.Method);
     }
 }