是否可以在.net中扩展class属性?

时间:2009-10-31 10:08:22

标签: c# .net

我有一个图书馆。该库包含名为tPage的类。此tPage类未标记为可序列化。我无法修改此库。我需要序列化这个。

如何扩展此类属性?

有可能吗?

3 个答案:

答案 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提出了很好的建议(在输入答案时看到了它)。你可能想给他的想法一些想法。