C#: 使第三方对象可序列化

3

对于我自己的对象,我可以添加元标记[Serializable]使其可序列化。现在我使用一个需要进行序列化的第三方库。我检查了代码,应该没有问题。有没有一种方法可以在不更改第三方代码的情况下解决这个问题?


1
你不能只是子类化吗? - vulkanino
这在很大程度上取决于:a.使用哪种序列化程序(是BinaryFormatter吗?),以及b.类型的外观如何;就个人而言,我会使用单独的数据模型。 - Marc Gravell
4个回答

6
我的建议是:序列化数据,而不是实现。第三方对象的存在与数据无关;这是一个实现细节。因此,我总是提出同样的建议: 如果序列化变得复杂,首先要做的是引入一个单独的DTO模型,表示与实现无关的数据,并将当前状态映射到该DTO。这使您能够处理实现更改,而不影响存储,并允许序列化否则无法序列化的对象。
一些序列化程序提供解决方法-例如,使用protobuf-net时,您可以a:在运行时为任何类型提供序列化信息,并b:提供一个“代理”,以在出现麻烦时自动使用,但使用DTO模型更简单,更易于维护。
您使用的[Serializable]表明您正在使用BinaryFormatter;在我看来,这几乎从不是任何类型的存储的好选择,因为BinaryFormatter依赖于实现细节。它非常适合在两个同步应用程序域之间传递数据。

问题在于,我需要序列化的对象已经是DTO对象的一部分,并且被Web组件使用(来自MVC控件工具包)。因此,我需要使其可序列化。 - Patrick
@Patrick 如果你有什么不能在DTO中序列化的东西,那么它就不是DTO。 - Marc Gravell
问题在于MVC控件工具包提供了一个跟踪器对象来跟踪网格中的更改。例如,这将是一个List<Tracker<MyObject>>。我下载了工具包的源代码并自己添加了序列化。此外,我还要求维护者将其添加到工具包中,他会这样做。 - Patrick

0

直接将你的子类序列化。

[Serializable] public class Foo: Bar {}

如果使用XmlSerializer,请不要忘记构造函数。 - Candide
@Ingenu,构造函数有什么特别之处? - Buh Buh
2
@BuhBuh 它需要有一个公共的无参数构造函数才能被 XmlSerializer 使用;然而,应该注意到 [Serializable] 关联的是 BinaryFormatter,而不是 XmlSerializer - Marc Gravell
@BuhBuh 如果没有一个无参数构造函数,XmlSerializer 将会失败。 - Candide

0
如果类型是公共的,您应该能够使用 XmlSerializer 来实现您想要的功能。
这里有更多信息

将对象序列化和反序列化为 XML 文档。XmlSerializer 使您能够控制如何将对象编码为 XML。


0
写一个适配器或者准备做一些更极端的事情,比如反汇编程序集,注入可序列化属性,然后重新组装。

O_o. 这是一个非常极端的情况。如果你的目标类被封闭,你就没有权限创建重复的数据传输对象(DTO),也无法将其序列化为二进制、XML、JSON或CSV格式,而且还有其他不可逾越的力量阻碍你在代码中完成序列化操作,那么只能深入程序集并在IL中进行修改。 - Oybek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接