【问题标题】:Reacting on serialize and deserialize of an instance对实例的序列化和反序列化做出反应
【发布时间】:2012-01-16 15:16:21
【问题描述】:

我有一个正在序列化的类。我用[Serializable] 对其进行了注释,并且我正在使用二进制序列化程序。一切正常。

但是后来我介绍了新的属性,这些属性不能被序列化(可以说它们包含很多关于 GUI 的混乱,不需要记住)。我可以根据类的其他属性计算这些属性。

我需要做两次,当我序列化时 - 清理混乱并进入准备序列化的稳定状态。和反序列化 - 再次计算所有需要的属性。

我需要对正在序列化/反序列化的“事件”实例做出反应。

但是我找不到这些事件,因为我没有实现接口ISerializable 或抽象类Aserializable,而只有类属性[Serializable]

我不知道什么时候类被序列化,因为它不是这个类的关注点;它被序列化为另一个类的字段。

有什么方法可以让我对这些事件做出反应?

【问题讨论】:

  • 您必须实现ISerializable 才能实现此目的。

标签: c# .net serialization


【解决方案1】:

您可以使用OnDeserializedAttribute 及其相关属性(OnSerializing、OnSerialized、OnDeserializing)来创建在序列化/反序列化过程中调用的特殊方法。

【讨论】:

    【解决方案2】:

    通过实现 ISerializable 构建 Custome Serialization。使用OnSerializingAttribute,在序列化之前操作对象,使用OnDeserializingAttribute,在反序列化之前操作。

    【讨论】:

    • 请注意,如果您计划与序列化过程本身进行交互,则只需要实现 ISerializable。对于 OP 的情况,使用属性和“序列化事件”方法就足够了。
    【解决方案3】:

    您是否考虑过[XmlIgnoreAttribute] 属性?它将阻止属性被序列化。无需篡改序列化工作流程。

    我的错,没有意识到你想在反序列化时重新加载一些属性。那么为什么不序列化这些呢?在一个可选的 subObject 中,还是什么?

    【讨论】:

    • 他正在使用二进制序列化程序。 [XmlIgnoreAttribute] 对二进制序列化器没有影响。如果要序列化为二进制或 SOAP,则使用 NonSerialized;如果使用 XmlSerializer 严格序列化为 XML,则使用 XmlIgnore。请参阅 MSDN 上 [NonSerializedAttribute] 类的备注部分。 msdn.microsoft.com/en-us/library/…
    • 尽职尽责。谢谢你。但问题仍然存在:为什么不使用带有“显示”属性的香草序列化,或者不使用它们 + GET 访问器中的值计算?
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多