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)); }
private void EnsureReadMethod(Type type) { if (!readMethodsCache.ContainsKey(type)) { var rmg = new ReadMethodGenerator(type, stamper, treatCollectionAsUserObject); readMethodsCache.Add(type, rmg.Method); } }
private void EnsureReadMethod(Type type) { if (!readMethodsCache.ContainsKey(type)) { var rmg = new ReadMethodGenerator(type, stamper); readMethodsCache.Add(type, rmg.Method); } }
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); } }