{"record":{"id":"7f5011acf69fd216","repo":"dotnet/wpf","slug":"sr-reachserialization-wrongpackagingpolicy","errorCode":null,"errorMessage":"SR.ReachSerialization_WrongPackagingPolicy","messagePattern":"SR\\.ReachSerialization_WrongPackagingPolicy","errorType":"exception","errorClass":"XpsSerializationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachSerializationUtils.cs","lineNumber":971,"sourceCode":"            }\n\n            if (!useID && navigateUri == null)\n            {\n                // don't write out this path\n                return;\n            }\n\n            writer.WriteStartElement(nameForType);\n\n            if (navigateUri != null)\n            {\n                if (IsFragment(navigateUri))\n                {\n                    XpsPackagingPolicy policy = SerializationManager.PackagingPolicy as XpsPackagingPolicy;\n                    XpsOMPackagingPolicy omPolicy = SerializationManager.PackagingPolicy as XpsOMPackagingPolicy;\n                    if (policy == null && omPolicy == null)\n                    {\n                        throw new XpsSerializationException(SR.ReachSerialization_WrongPackagingPolicy);\n                    }\n\n                    Uri documentUri = SerializationManager.PackagingPolicy.CurrentFixedDocumentUri;\n                    Uri pageUri = SerializationManager.PackagingPolicy.CurrentFixedPageUri;\n\n                    Uri relativeUri = PackUriHelper.GetRelativeUri(pageUri, documentUri);\n                    string documentFragmentUri = relativeUri.OriginalString + navigateUri.OriginalString;\n                    WriteAttribute(writer, \"FixedPage.NavigateUri\", documentFragmentUri);\n                }\n                else\n                {\n                    WriteAttribute(writer, \"FixedPage.NavigateUri\", navigateUri);\n                }\n                WriteAttribute(writer, \"Fill\", \"#00000000\");\n            }\n            else\n            {\n                WriteAttribute(writer, \"Opacity\", \"0\");","sourceCodeStart":953,"sourceCodeEnd":989,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachSerializationUtils.cs#L953-L989","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nserializationManager.PackagingPolicy = new MyCustomPackagingPolicy();\n// after\nserializationManager.PackagingPolicy = new XpsPackagingPolicy(package);","handlingStrategy":"validation","validationCode":"bool canSerializeFragments = SerializationManager.PackagingPolicy is XpsPackagingPolicy or XpsOMPackagingPolicy;","typeGuard":"bool IsXpsPolicy(PackagingPolicy p) => p is XpsPackagingPolicy or XpsOMPackagingPolicy;","tryCatchPattern":null,"preventionTips":["Do not replace the default PackagingPolicy unless necessary","Derive custom policies from XpsPackagingPolicy","Test documents containing Hyperlink/NavigateUri when changing packaging policy"],"tags":["wpf","xps","serialization","packaging-policy"],"backgroundTag":"incompatible-source-type","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-22T01:17:13.364Z"}