dotnet/wpf · error · XpsSerializationException

SR.ReachSerialization_WrongPackagingPolicy

Error message

SR.ReachSerialization_WrongPackagingPolicy

What it means

ReachTreeWalker requires an XPS-capable packaging policy to resolve fragment NavigateUri references into relative page/document URIs. When the active PackagingPolicy is neither XpsPackagingPolicy nor XpsOMPackagingPolicy, the walker cannot produce valid pack URIs, so it aborts serialization with XpsSerializationException. This is an invariants check that the policy in use supports the XPS packaging model.

Solutions

  1. Use the default XpsPackagingPolicy (or XpsOMPackagingPolicy) with your XpsSerializationManager instead of a custom PackagingPolicy subclass
  2. If a custom policy is required, derive it from XpsPackagingPolicy so it passes the type checks
  3. Remove or replace fragment NavigateUri values in the document tree before serializing with a non-XPS policy

Example fix

// before
serializationManager.PackagingPolicy = new MyCustomPackagingPolicy();
// after
serializationManager.PackagingPolicy = new XpsPackagingPolicy(package);
Defensive patterns

Strategy: validation

Validate before calling

bool canSerializeFragments = SerializationManager.PackagingPolicy is XpsPackagingPolicy or XpsOMPackagingPolicy;

Type guard

bool IsXpsPolicy(PackagingPolicy p) => p is XpsPackagingPolicy or XpsOMPackagingPolicy;

Prevention

When it happens

Trigger: Serializing a FixedDocument/FixedPage tree that contains Hyperlink or other elements with a fragment NavigateUri while SerializationManager.PackagingPolicy was set to a custom PackagingPolicy subclass that does not derive from XpsPackagingPolicy or XpsOMPackagingPolicy.

Common situations: Developers plugging a custom PackagingPolicy into XpsSerializationManager (or writing via Package with a hand-rolled policy) and then serializing documents containing hyperlinks; copying sample code that swaps the default policy without realizing NavigateUri handling requires an XPS-specific policy.

Understand the failure class

Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.

Related errors


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

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachSerializationUtils.cs:971

            }

            if (!useID && navigateUri == null)
            {
                // don't write out this path
                return;
            }

            writer.WriteStartElement(nameForType);

            if (navigateUri != null)
            {
                if (IsFragment(navigateUri))
                {
                    XpsPackagingPolicy policy = SerializationManager.PackagingPolicy as XpsPackagingPolicy;
                    XpsOMPackagingPolicy omPolicy = SerializationManager.PackagingPolicy as XpsOMPackagingPolicy;
                    if (policy == null && omPolicy == null)
                    {
                        throw new XpsSerializationException(SR.ReachSerialization_WrongPackagingPolicy);
                    }

                    Uri documentUri = SerializationManager.PackagingPolicy.CurrentFixedDocumentUri;
                    Uri pageUri = SerializationManager.PackagingPolicy.CurrentFixedPageUri;

                    Uri relativeUri = PackUriHelper.GetRelativeUri(pageUri, documentUri);
                    string documentFragmentUri = relativeUri.OriginalString + navigateUri.OriginalString;
                    WriteAttribute(writer, "FixedPage.NavigateUri", documentFragmentUri);
                }
                else
                {
                    WriteAttribute(writer, "FixedPage.NavigateUri", navigateUri);
                }
                WriteAttribute(writer, "Fill", "#00000000");
            }
            else
            {
                WriteAttribute(writer, "Opacity", "0");

View on GitHub (pinned to 81131a70a4)