如何在 .net 中使类可序列化而无需 Serializable 属性

Posted

技术标签:

【中文标题】如何在 .net 中使类可序列化而无需 Serializable 属性【英文标题】:How to make a class serializable without Serializable attibute in .net 【发布时间】:2011-01-28 12:29:37 【问题描述】:

我有一个调试器可视化器,用于以数据表的形式查看类对象列表。但是代码的限制是该类应该是可序列化的,即应该标记为 [Serializable],如果该类未标记为 Serializable,则调试器会崩溃。那么,如果类未标记为可序列化,谁能告诉我如何在运行时使类可序列化。

【问题讨论】:

【参考方案1】:

您不能在运行时修改现有类的元数据。

【讨论】:

是否有替代方案或没有办法实现这一目标? @Ashwani,您可以创建另一个封装真实类并标有Serializable 的类,然后使用该类。 你不是在说调试模式和发布模式的区别吧? @Andrew Bienert:不,就像我们可以在数据集可视化工具中看到数据表的数据一样,我为类对象列表创建了自己的可视化工具,以在数据表中显示列表数据。跨度> 【参考方案2】:

如果某个类没有标记为[Serializable],可以尝试使用SerializationSurrogate进行序列化

【讨论】:

谢谢拉姆。我会调查的 这仍然不能解决我的问题,但它帮助我学习了运行时序列化。谢谢。 链接断开.....msdn.microsoft.com/en-us/library/…【参考方案3】:

任何具有公共 get/set 属性的类都是 XmlSerializable。你可以改用 XML 序列化器吗?

【讨论】:

【参考方案4】:

一个类缺少 [Serializable] 的事实可以用两种方式来解释。这可能是遗漏错误,这是更常见的情况。或者该类根本不支持序列化。这并不罕见,类通常依赖于在反序列化时无法忠实再现的状态,因为它依赖于全局程序状态。任何 Windows 窗体控件都是一个很好的例子,如果没有处于所需状态的本机 Windows 窗口,它们就无法反序列化,这种状态通常还需要创建其他窗口(如容器窗口)和很多消息。

好吧,这不会帮助您实现可视化工具。您无法通过序列化可靠地实现它。但是,使用反射可以让您访问相同的属性和字段值。并且始终支持反射。

【讨论】:

【参考方案5】:

您可以以不同的方式看待您的问题,使用 [Serializable] 允许您使用 dotnet 库序列化为 json、xml 等。您仍然可以通过编写自己的方法来序列化,因为基本上任何数据结构都可以以xml或json格式表示。

在类中添加 [Serializable] 是 Bill Wagner 的精彩著作 Effective C#: 50 specific ways to improve your C# 中的最佳实践技巧之一。

你可以序列化一个类而不是 [Serializable] 正如@Darin (+1) 指出的你不能回顾性地重新装饰一个类。如果我是你,我会输入 [Serializable],因为解决这个问题不值得付出努力。

【讨论】:

谢谢。只是出于好奇,为类添加 [Serializable] 属性是否会对性能造成影响?我的意思是我们应该为我们创建的任何类包含可序列化的属性吗? @Ashwani Bill Wagner 推荐 Effective C# 中的实践——我手头没有这本书,但是当我阅读关于为什么它应该是默认值的部分时,这个论点很有说服力。这个关于 SO 的答案确认没有性能影响 - ***.com/questions/1402903/…

以上是关于如何在 .net 中使类可序列化而无需 Serializable 属性的主要内容,如果未能解决你的问题,请参考以下文章

在Boost.MPI中使类可序列化是什么意思?

如何在Asp .Net Web API中的请求的整个生命周期中使类对象可用?

如何使类可迭代?

Swift 5.+ - 使类可散列?

如何在Python中使类成员进程安全

使类可迭代尊重继承