{"record":{"id":"5655a7749b3c1905","repo":"dotnet/wpf","slug":"sr-reachserialization-musthaveserializationmanager","errorCode":null,"errorMessage":"SR.ReachSerialization_MustHaveSerializationManager","messagePattern":"SR\\.ReachSerialization_MustHaveSerializationManager","errorType":"exception","errorClass":"XpsSerializationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/NGCSerializerAsync.cs","lineNumber":124,"sourceCode":"        SerializeObject(\n            SerializablePropertyContext serializedProperty\n            )\n        {\n            BeginSerializeObject(serializedProperty);\n        }\n\n        internal\n        virtual\n        void\n        BeginSerializeObject(\n            SerializablePropertyContext serializedProperty\n            )\n        {\n            ArgumentNullException.ThrowIfNull(serializedProperty);\n\n            if (SerializationManager == null)\n            {\n                throw new XpsSerializationException(SR.ReachSerialization_MustHaveSerializationManager);\n            }\n\n            //\n            // At this stage discover the graph of properties of the object that\n            // need to be serialized\n            //\n            SerializableObjectContext serializableObjectContext = DiscoverObjectData(serializedProperty.Value,\n                                                                                     serializedProperty);\n\n            if(serializableObjectContext!=null)\n            {\n                //\n                // Push the object at hand on the context stack\n                //\n                SerializationManager.GraphContextStack.Push(serializableObjectContext);\n\n                NGCSerializerContext context = new NGCSerializerContext(this,\n                                                                        serializableObjectContext,","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/NGCSerializerAsync.cs#L106-L142","documentation":"BeginSerializeObject (the property overload, reached via SerializeObject) requires an active SerializationManager on the async serializer. If SerializationManager is null — i.e. the serializer was created without a manager or StartSerialization was never called — an XpsSerializationException with SR.ReachSerialization_MustHaveSerializationManager is thrown before discovering property data.","triggerScenarios":"Calling BeginSerializeObject(serializedProperty) (via SerializeObject) on an NGCSerializerAsync whose SerializationManager property is null: serializer constructed without Initialize/manager, or EndSerialization/reset already tore down the manager.","commonSituations":"Reusing an NGCSerializerAsync instance across documents after EndSerialization cleared the manager; calling SerializeObject before StartSerialization in async XPS save pipelines.","solutions":["Call StartSerialization (which attaches the serialization manager) before SerializeObject/BeginSerializeObject.","Ensure the manager passed at construction is retained and not nulled before serialization completes.","Create a fresh NGCSerializerAsync with a valid NgcSerializationManagerAsync for each document instead of reusing a finished instance."],"exampleFix":"// before\nserializer.SerializeObject(rootProperty); // no manager attached yet\n// after\nserializer.StartSerialization(packagingPolicy);\nserializer.SerializeObject(rootProperty);","handlingStrategy":"validation","validationCode":"if (serializer.SerializationManager == null)\n    throw new InvalidOperationException(\"Call StartSerialization before SerializeObject.\");","typeGuard":"bool ReadyToSerialize(NGCSerializerAsync s) => s.SerializationManager != null;","tryCatchPattern":"try { serializer.SerializeObject(property); }\ncatch (XpsSerializationException ex) {\n    // reinitialize: serializer.StartSerialization(policy) then retry\n}","preventionTips":["Always call StartSerialization before SerializeObject in async flows.","Never reuse a serializer instance after EndSerialization; create a new one.","Centralize serializer lifecycle in one class so call order is enforced."],"tags":["wpf","xps","serialization","invalid-state"],"backgroundTag":"invalid-state-transition","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}