我有一个图书馆。该库包含名为tPage
的类。此tPage
类未标记为可序列化。我无法修改此库。我需要序列化这个。
如何扩展此类属性?
有可能吗?
答案 0 :(得分:6)
如果该类未标记为[Serializable]
,则无法序列化该类。如果从中继承并将属性应用于子类,则序列化程序将抛出异常,因为它无法序列化基类成员。
解决此问题的方法有两种:
创建一个新类tSerializablePage
,其中包含与tPage
相同的数据,并标记为[Serializable]
。如果要执行序列化并将tPage
传递给序列化程序,请将tSerializablePage
实例中的值复制到tSerializablePage
实例。反序列化此实例时,您将负责从其包含的值创建tPage
的实例。
为tPage
实施ISerializationSurrogate
接口,以提供直接序列化和反序列化tPage
个实例的机制。
如果您不熟悉手动序列化接口,那么前一个解决方案可能更容易实现,但是接口是.NET Framework解决序列化非序列化类的问题。
答案 1 :(得分:1)
我假设你正在使用BinaryFormatter
。首先,我认为BinaryFormatter
并不总是一个好主意(它是very brittle,并且不能承受太大的变化)。但我还建议问题是你正在尝试序列化实现,而实际上你需要序列化的是数据
我会通过编写代表系统状态的自己的DTO并序列化DTO来解决这个问题:
PageDto tmp = new PageDto(myPageInstance);
// serialize tmp
优点:
Page
实现,这无关紧要Page
库的版本时,它不会破坏序列化(您的dto可以保持不变)答案 2 :(得分:0)
它不可序列化可能是由于类的内部(例如某些成员无法序列化)。因此,如果您可以剖析/反向设计该类并使其可以安全地进行序列化,那么请继续。否则,在入侵后'黑客攻击'将不适合你。
Programming Hero
提出了很好的建议(在输入答案时看到了它)。你可能想给他的想法一些想法。