Beispiel #1
0
        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));
        }
Beispiel #3
0
        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);
        }