c# - DataContractSerializer 无法在命名空间更改后反序列化

标签 c# namespaces datacontractserializer

我有 50 个标有 DataContractAttribute 的类。

这些类形成了一个巨大的层次树,使用DataContractSerializer将其序列化/反序列化为xml。

除了我遗漏的 3 个类外,它们都指定了一个自定义数据契约(Contract)命名空间 [DataContract(Namespace="http://example.com")]

// Old class definitions 
[DataContract(IsReference=true)]  // <-- forgot ns
public class Type1{}
[DataContract(IsReference=true)] // <-- forgot ns
public class Type2{}
[DataContract(IsReference=true)] // <-- forgot ns
public class Type3{}
[DataContract(IsReference=true, Namespace="http://example.com")] // <-- 47 more like this
public class Type4{} 

我希望这 3 个类与其他 47 个类使用相同的数据契约(Contract)命名空间。

更改后,我之前保存的所有 xml 都无法加载。

// Changed to:
[DataContract(IsReference=true, Namespace="http://example.com")] // <-- changed ns
public class Type1{} 
[DataContract(IsReference=true, Namespace="http://example.com")] // <-- changed ns
public class Type2{} 
[DataContract(IsReference=true, Namespace="http://example.com")] // <-- changed ns
public class Type3{} 
[DataContract(IsReference=true, Namespace="http://example.com")]
public class Type4{}

我试过这个方法:

DataContractSerializer - change namespace and deserialize file bound to old namespace

但是得到一个 SerializationException在流中找不到引用 id 'i5' 的反序列化对象。

如何反序列化在命名空间更改之前之后保存的 xml?

最佳答案

我会亲自更改数据协定,然后创建一个脚本来解析以前保存的 xml 以添加命名空间信息。快速简单。

类似于将 xml 加载为字符串然后调用:

xmlstr=xmlstr.Replace("<Type1>", "<Type1 xmlns:Namespace=\"http://example.com\">");

或者创建两个类(一个使用旧命名空间,一个使用新命名空间)创建一个映射方法,以便您可以基于旧命名空间反序列化旧 xml,并在使用新命名空间映射后序列化它们。

关于c# - DataContractSerializer 无法在命名空间更改后反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23630369/

相关文章:

c# - 数据契约(Contract)序列化器可以用于任何第三方网络服务吗

c# - WF4 While 代码中的事件条件

javascript - UpdatePanel 内的标签不会显示从代码隐藏分配的值

c# - Parallel.Foreach c# 暂停和停止功能?

javascript - 使用 JavaScript/XLS 函数在 XML 中包含命名空间

c# - 是否有用于序列化自定义对象的 ODataSerializer?

c# - Microsoft.CSharp.Core.targets 缺失

javascript - 我可以在 'window' 以外的上下文中加载 javascript 文件吗?

c# - 一个命名空间在另一个命名空间中找不到类

c# - DataContract 无法序列化集合成员