gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:48:07 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com