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
- Use the default XpsPackagingPolicy (or XpsOMPackagingPolicy) with your XpsSerializationManager instead of a custom PackagingPolicy subclass
- If a custom policy is required, derive it from XpsPackagingPolicy so it passes the type checks
- 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
- Do not replace the default PackagingPolicy unless necessary
- Derive custom policies from XpsPackagingPolicy
- Test documents containing Hyperlink/NavigateUri when changing packaging policy
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
- Cannot find the appropriate serializer.
- Cannot find the appropriate serializer.
- Cannot find the appropriate serializer.
- Cannot instantiate a serializer of the given type.
- CurrentFixedPageWriter uninitialized
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)