更改名称空间后,DataContractSerializer无法反序列化

时间:2014-05-13 11:45:22

标签: c# namespaces datacontractserializer

我有50个标有DataContractAttribute的课程。

这些类构成了一个巨大的分层树,使用DataContractSerializer到xml进行序列化/反序列化。

所有这些都指定了一个自定义datacontract命名空间[DataContract(Namespace="http://example.com")],除了3个类,我错过了。

// 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个类相同的datacontract命名空间。

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

// 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

但是SerializationExceptionDeserialized object with reference id 'i5' not found in stream.

如何在命名空间更改

之后保存之后保存

1 个答案:

答案 0 :(得分:1)

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

将xmls加载为字符串,然后调用:

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

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