响应序列化和反序列化实例的操作

4
我有一个类需要进行序列化。我使用了[Serializable]注解并且使用二进制序列化。一切都正常。但是后来我添加了新的属性,这些属性不能被序列化(比如说它们包含了很多关于GUI的信息,但是这些信息不需要被记住)。我可以根据类的其他属性计算出这些属性。我需要在序列化时清理这些杂乱的属性,并将其设置为稳定状态以备序列化。同时,在反序列化时,我需要重新计算所有必要的属性。我需要对实例正在被序列化/反序列化的"事件"做出反应。然而,我无法找到这些事件,因为我没有实现接口ISerializable或抽象类Aserializable,只是使用了类属性[Serializable]。我不知道类何时被序列化,因为这不是这个类的问题;它作为另一个类的字段进行序列化。有没有办法让我对这些事件做出反应?

您必须实现 ISerializable 接口以实现此功能。 - Tomislav Markovski
3个回答

2

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


0

请注意,只有在计划与序列化过程本身交互时才需要实现ISerializable接口。对于OP的情况,使用属性和“序列化事件”方法就足够了。 - Dan Bryant

0
你有没有考虑过使用 [XmlIgnoreAttribute] 属性?它可以防止某个属性被序列化。无需干扰序列化工作流程。
抱歉,没意识到你想要在反序列化时重新加载某些属性。那为什么不将它们序列化呢?可以放在一个可选的子对象中,或者其他地方。

他正在使用二进制序列化程序。 [XmlIgnoreAttribute] 对二进制序列化程序没有影响。 如果您要序列化为二进制或SOAP,则应使用NonSerialized,如果您要严格使用XmlSerializer将其序列化为XML,则使用XmlIgnore。请参见MSDN上[NonSerializedAttribute]类的备注部分。 http://msdn.microsoft.com/en-us/library/system.nonserializedattribute.aspx - Myrtle
1
已经注意到了。谢谢。但问题仍然存在:为什么不使用原始序列化,带有“显示”属性或没有它们+在GET访问器中进行值计算? - Vinzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接