gpt4 book ai didi

.net - 序列化问题 : Different namespaces (. NET)

转载 作者:行者123 更新时间:2023-12-04 17:00:52 25 4
gpt4 key购买 nike

我们发布了一个使用 .NET soap 格式化程序序列化一个非常复杂的对象的程序。 Soap 不能很好地处理所涉及的类的新版本,所以我们切换到二进制格式化程序。

为了处理旧的对象版本,我编写了一个转换器,在soap 中反序列化对象,并在二进制中重新序列化它。

转换器在切换时使用类的版本,因此我将这些类放在不同的命名空间中以避免与当前版本发生冲突。

问题是:命名空间显然是用类序列化的,所以我收到错误:无法将 NamespaceA.class 转换为 NamespaceB.class。 (啊!)

类(class)完全相同;唯一的问题是命名空间。如何让框架忽略命名空间?

最佳答案

根据这个新闻组的帖子,Changing a namespace causes errors when using "BinaryFormatter.Deserialize" to reload object data saved while defined under a different namesapce(sic) ,你应该看看 SerializationBinder类(class)。

但是,我会敦促您找到处理数据的不同方式,因为二进制格式化程序旨在用作短期传输包装处理程序,而不是存储处理程序。

你看了吗protocol buffers , 举个例子?

编辑 :好的,阅读您的评论并重新阅读您的问题后,结果证明您的问题毕竟与序列化无关,二进制或其他。

问题显然是你已经序列化了一个类型 A 的类,并尝试反序列化它,或者在反序列化之后将它转换为类型 B,一种不同的类型。

这当然不是开箱即用的,并且可以在不引入序列化的情况下轻松复制,您只需执行以下操作:

public class A { ... } <-- a class with some properties and stuff
public class B { ... } <-- another class, with the same properties and stuff

public void Test()
{
A a = new A();
B b = a; <-- you get the same problem as in your code here
}

有很多方法可以处理这个问题。例如,您可以将转换运算符实现到其中一个类中,这将使上述代码起作用。

您可以实现一种“克隆”类型的方法,该方法采用 A 类型的对象,构造一个 B 类型的新对象,然后复制所有属性和内容。

请注意,XML 序列化使用您提供给它的类型作为其根类型,这意味着您可以序列化类型 A 的对象,并将其反序列化为类型 B 的对象,前提是您仅在打算将 B 提供给序列化对象时反序列化,并提供这种类型有足够的元数据看起来像类型 A 的对象。

我有一个控制问题要问你,这可能会让我们知道你为什么要这样做:为什么你不能将它反序列化为原始类型并保留它?为什么一定要投?

关于.net - 序列化问题 : Different namespaces (. NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2648616/

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