private Action <PrimitiveWriter, object> PrepareWriteMethod(Type actualType, int surrogateId) { if (surrogateId == -1) { var specialWrite = LinkSpecialWrite(actualType); if (specialWrite != null) { // linked methods are not added to writeMethodCache, there's no point return(specialWrite); } } if (!isGenerating) { if (surrogateId != -1) { return((pw, o) => InvokeCallbacksAndWriteObject(surrogatesForObjects.GetByIndex(surrogateId).DynamicInvoke(new [] { o }))); } return(WriteObjectUsingReflection); } var method = new WriteMethodGenerator(actualType, treatCollectionAsUserObject, surrogateId, Helpers.GetFieldInfo <ObjectWriter, InheritanceAwareList <Delegate> >(x => x.surrogatesForObjects), Helpers.GetMethodInfo <ObjectWriter>(x => x.InvokeCallbacksAndWriteObject(null))).Method; var result = (Action <PrimitiveWriter, object>)method.CreateDelegate(typeof(Action <PrimitiveWriter, object>), this); if (writeMethodCache != null) { writeMethodCache.Add(actualType, method); } return(result); }
private ObjectWriter CreateWriter(Stream stream) { WriteMethods writeMethods; if (settings.SerializationMethod == Method.Generated) { writeMethods.writeMethodsProvider = new DynamicMethodProvider <WriteMethodDelegate>(t => { var specialWrite = ObjectWriter.LinkSpecialWrite(t); if (specialWrite != null) { return(specialWrite); } var generator = new WriteMethodGenerator(t, settings.DisableTypeStamping, settings.TreatCollectionAsUserObject); return(generator.Generate()); }); writeMethods.handleNewReferenceMethodsProvider = new DynamicMethodProvider <HandleNewReferenceMethodDelegate>(t => { if (recipes.TryGetValue(t, out var recipe)) { return((objectWriter, objectToWrite, objectId) => objectWriter.WriteRecipe(recipe, objectToWrite, objectId)); } var generator = new HandleNewReferenceMethodGenerator(t, objectsForSurrogates, settings.DisableTypeStamping, settings.TreatCollectionAsUserObject, OnPreSerialization != null, OnPostSerialization != null); return(generator.Generate()); }); writeMethods.surrogateObjectIfNeededMethodsProvider = new DynamicMethodProvider <SurrogateObjectIfNeededDelegate>(t => { var generator = new SurrogateObjectIfNeededMethodGenerator(t, surrogatesForObjects, settings.DisableTypeStamping, settings.TreatCollectionAsUserObject); return(generator.Generate()); }); writeMethods.writeReferenceMethodsProvider = new DynamicMethodProvider <WriteReferenceMethodDelegate>(t => { var generator = new WriteReferenceMethodGenerator(t, settings.DisableTypeStamping, settings.TreatCollectionAsUserObject); return(generator.Generate()); }); writeMethods.callPostSerializationHooksMethodsProvider = new DynamicMethodProvider <CallPostSerializationHooksMethodDelegate>(t => { var generator = new CallPostSerializationHooksMethodGenerator(t, settings.DisableTypeStamping, settings.TreatCollectionAsUserObject); return(generator.Generate()); }); } else { writeMethods = GetReflectionBasedWriteMethods(); } return(new ObjectWriter(stream, writeMethods, OnPreSerialization, OnPostSerialization, surrogatesForObjects, objectsForSurrogates, recipes, settings.TreatCollectionAsUserObject, settings.UseBuffering, settings.DisableTypeStamping, settings.ReferencePreservation)); }
private Action <PrimitiveWriter, object> PrepareWriteMethod(Type actualType) { var specialWrite = LinkSpecialWrite(actualType); if (specialWrite != null) { // linked methods are not added to writeMethodCache, there's no point return(specialWrite); } if (!isGenerating) { return(WriteObjectUsingReflection); } var method = new WriteMethodGenerator(actualType).Method; var result = (Action <PrimitiveWriter, object>)method.CreateDelegate(typeof(Action <PrimitiveWriter, object>), this); if (writeMethodCache != null) { writeMethodCache.Add(actualType, method); } return(result); }