我有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
但是SerializationException
说Deserialized object with reference id 'i5' not found in stream.
如何在命名空间更改
之后答案 0 :(得分:1)
我会亲自更改数据协定,然后创建一个脚本,解析以前保存的xmls以添加命名空间信息。快速而简单。
将xmls加载为字符串,然后调用:
xmlstr=xmlstr.Replace("<Type1>", "<Type1 xmlns:Namespace=\"http://example.com\">");
或者创建两个类(一个具有旧命名空间,一个具有new)创建一个映射方法,以便您可以基于旧命名空间反序列化旧xmls,并在使用新命名空间映射后对它们进行序列化。