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

c#:使第三方对象可序列化,c#,serialization,C#,Serialization,在我自己的对象上,我可以添加metatag[Serializable],使其可序列化。现在我使用了一个需要序列化的第三方库。我检查了代码,应该没有问题。有没有办法在不改变第三方代码的情况下修复此问题?如果类型是公共类型,您应该能够使用XmlSerializer来执行您想要的操作 有 在XML文档中序列化和反序列化对象。这个 XmlSerializer使您能够控制对象如何编码为XML 精确地获取子类并使其可序列化 [Serializable] public class Foo: Bar {} 编

在我自己的对象上,我可以添加metatag[Serializable],使其可序列化。现在我使用了一个需要序列化的第三方库。我检查了代码,应该没有问题。有没有办法在不改变第三方代码的情况下修复此问题?

如果类型是公共类型,您应该能够使用
XmlSerializer
来执行您想要的操作

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


精确地获取子类并使其可序列化

[Serializable] public class Foo: Bar {}

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

我的建议是:序列化数据,而不是实现。存在第三方对象的事实与数据无关;这是一个实现细节。因此,我总是提供相同的建议:如果序列化变得复杂,首先要做的是引入一个单独的DTO模型,它独立于实现来表示数据,并将当前状态映射到该DTO。这允许您在不影响存储的情况下处理实现更改,并允许序列化其他不可序列化的对象

一些序列化程序提供了解决方法—例如,使用protobuf net,您可以a:在运行时为任何类型提供序列化信息,b:提供“代理”,以便在出现问题时自动使用,但是—使用DTO模型更简单,更易于维护


使用
[Serializable]
建议使用
BinaryFormatter
;在我看来,这几乎从来都不是任何类型存储的好选择,因为
BinaryFormatter
依赖于实现细节。它可以很好地在两个同步应用程序域之间传递数据,不过

您不能只创建子类吗?这在很大程度上取决于a:哪个序列化程序(是
二进制格式化程序
?)和b:类型是什么;就我个人而言,我只会使用一个单独的数据模型。如果使用XmlSerializer,请不要忘记构造函数。@Ingenu,构造函数有什么特别之处?@BuhBuh它需要一个公共的无参数构造函数才能被XmlSerializer使用。
XmlSerializer
;但是,需要注意的是,
[Serializable]
BinaryFormatter
相关,而不是
XmlSerializer
。@BuhBuh XmlSerializer如果没有无参数构造函数,则会失败。问题是,我需要序列化的对象已经是DTO对象的一部分,并且由提供的网络组件使用(来自mvc控件工具包)。因此,我需要使其可序列化。@Patrick如果您在DTO中有一些不可序列化的东西,那么它就不是DTO。问题是mvc控件toolkit提供了一个跟踪对象来跟踪网格中的更改。例如,这将是一个列表>。我下载了工具箱的源代码,并自己添加了序列化。此外,我要求维护人员将其添加到工具箱中,他会这样做。这是一个非常极端的情况。如果您的目标类已被密封,则您没有创建重复dto的权限,无法将其序列化为二进制、XML、JSON或CSV,并且其他一些不可破坏的力量正在隐藏您以代码完成序列化,只有在assem中diggbly,并在IL中进行修改。