gpt4 book ai didi

c# - OnSerializingAttribute 与 ISerializable

转载 作者:太空狗 更新时间:2023-10-29 21:42:22 26 4
gpt4 key购买 nike

我正在阅读 msdn 上的自定义序列化文章:http://msdn.microsoft.com/en-us/library/ty01x675%28VS.80%29.aspx

里面提到了实现自定义序列化有两种方式:
1、使用OnDeserializedAttribute、OnDeserializingAttribute、OnSerializedAttribute、OnSerializingAttribute
2、实现ISerializable接口(interface)

根据 MSDN,方法 #1 是“最佳实践和最简单的方法”,但我不明白这两种方法是怎么回事。据我了解,OnSerializing|OnSerialized|etc 属性允许您将方法挂接到序列化的特定阶段,而 ISerializable 接口(interface)允许您直接修改进入和到来的内容来自 SerializationInfo。这是正确的吗?

为了解决我的困惑,你如何实现 OnSerializing 来序列化不同名称下的对象字段?像下面的代码:

public virtual void GetObjectData(SerializationInfo info, StreamingContext context){    info.AddValue("i", n1);    info.AddValue("j", n2);    info.AddValue("k", str);}

更新:尽管 Frederik Gheysels 的回答并不完全正确(使用 Serializable 装饰是 OnSerializing/OnDeserializing 属性和 ISerializable 接口(interface)的先决条件),但他确实指出 OnSerializing/OnDeserializing 属性是意味着是 ISerializable 的补充,所以我接受他在这一点上的回答。

最佳答案

OnSerializing/OnDeserializingISerializable 互补或 SerializableAttribute .

换句话说:OnSerializing/OnDeserializing不是 ISerializable 的替代品或 SerializableAttribute .

这 2 个属性 ( OnSerializing/OnDeserializing ) 允许您在序列化或反序列化对象时控制/执行额外的操作。但是,为了能够做到这一点,应用这些属性的类型必须是可序列化的(从而实现 ISerializable 接口(interface),或者用可序列化属性修饰)。

这在您所指的 MSDN 文章中也是这样说的:- OnSerializing 和 OnDeserializing 用于在序列化期间和之后“更正”数据。

您可以很容易地测试它。创建这样的类型,并尝试对其进行序列化:

public class Foo
{
private int _bar = 5;

[OnSerializing]
public void OnSerializeFoo( StreamingContext context )
{
_bar = 10;
}
}

请注意,该类型没有实现 ISerializable , 也没有用 SerializableAttribute 装饰.尝试序列化该类型的实例,您将面临 SerializationException ,因为 Foo不可序列化。

因此,您可以使用这些属性(OnSerializing、OnDeserializing)来实现在序列化或反序列化特定类型的实例时应执行的附加逻辑。

关于c# - OnSerializingAttribute 与 ISerializable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1462936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com