dotnet/wpf · error · XpsSerializationException

SR.ReachSerialization_MustHaveSerializationManager

Error message

SR.ReachSerialization_MustHaveSerializationManager

What it means

ReachSerializerAsync.BeginSerializeObject (property overload) requires a non-null SerializationManager to discover and enqueue asynchronous serialization work. If the manager reference is null, no async operation can be queued, so an XpsSerializationException is thrown synchronously at Begin time.

Solutions

  1. Ensure the async serializer is created with a valid XpsSerializationManagerAsync instance
  2. Drive async serialization through XpsDocument.BeginWrite rather than constructing ReachSerializerAsync manually
  3. Guard with (serializer.SerializationManager != null) before calling Begin methods

Example fix

// before
var s = new ReachPageSerializerAsync(null);
s.BeginSerializeObject(page, prop, dp, 0, cb, state);
// after
var m = new XpsSerializationManagerAsync(new XpsPackagingPolicy(package), false);
var s = new ReachPageSerializerAsync(m);
s.BeginSerializeObject(page, prop, dp, 0, cb, state);
Defensive patterns

Strategy: validation

Validate before calling

if (serializer.SerializationManager == null) throw new InvalidOperationException("Async serializer has no manager");

Try / catch

try { result = serializer.BeginSerializeObject(value, prop, dp, depth, cb, state); }
catch (XpsSerializationException ex) when (ex.Message.Contains("SerializationManager")) { /* rebuild async pipeline */ }

Prevention

When it happens

Trigger: Calling BeginSerializeObject(Object, SerializableProperty, DependencyProperty, Int32, AsyncCallback, Object) on an async serializer whose SerializationManager was never set (constructed with null) or was reset.

Common situations: Manually instantiating async serializers instead of using XpsDocument.BeginWrite/XpsSerializationManagerAsync; custom pipelines that forget to supply the manager to every serializer in the chain.

Understand the failure class

Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/e2ca476da503a02e. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachSerializerAsync.cs:136

        SerializeObject(
            SerializablePropertyContext serializedProperty
            )
        {
            BeginSerializeObject(serializedProperty);
        }

        internal
        virtual
        void
        BeginSerializeObject(
            SerializablePropertyContext serializedProperty
            )
        {
            ArgumentNullException.ThrowIfNull(serializedProperty);

            if (SerializationManager == null)
            {
                throw new XpsSerializationException(SR.ReachSerialization_MustHaveSerializationManager);
            }

            //
            // At this stage discover the graph of properties of the object that
            // need to be serialized
            //                      
            SerializableObjectContext serializableObjectContext = DiscoverObjectData(serializedProperty.Value,
                                                                                     serializedProperty);

            if(serializableObjectContext!=null)
            {
                //
                // Push the object at hand on the context stack
                //
                SerializationManager.GraphContextStack.Push(serializableObjectContext);

                ReachSerializerContext context = new ReachSerializerContext(this,
                                                                            serializableObjectContext,

View on GitHub (pinned to 81131a70a4)