internal static WriteMethods GetReflectionBasedWriteMethods() { WriteMethods writeMethods; writeMethods.writeMethodsProvider = new DynamicMethodProvider <WriteMethodDelegate>(t => { var specialWrite = ObjectWriter.LinkSpecialWrite(t); return(specialWrite ?? ObjectWriter.WriteObjectUsingReflection); }); writeMethods.handleNewReferenceMethodsProvider = new DynamicMethodProvider <HandleNewReferenceMethodDelegate>(t => { return((ow, o, refId) => ow.HandleNewReference(o, refId)); }); writeMethods.surrogateObjectIfNeededMethodsProvider = new DynamicMethodProvider <SurrogateObjectIfNeededDelegate>(t => { return((ow, o, refId) => ow.SurrogateObjectIfNeeded(o, refId)); }); writeMethods.writeReferenceMethodsProvider = new DynamicMethodProvider <WriteReferenceMethodDelegate>(t => { return((ow, o) => ow.CheckLegalityAndWriteDeferredReference(o)); }); writeMethods.callPostSerializationHooksMethodsProvider = new DynamicMethodProvider <CallPostSerializationHooksMethodDelegate>(t => { return((ow, o) => ow.CallPostSerializationHooksUsingReflection(o)); }); return(writeMethods); }
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 => { 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, settings.TreatCollectionAsUserObject, settings.UseBuffering, settings.DisableTypeStamping, settings.ReferencePreservation)); }