Csharp/C#教程:在不实现任何自定义序列化/反序列化时,是否需要实现ISerializable接口分享


在不实现任何自定义序列化/反序列化时,是否需要实现ISerializable接口

我正在寻找一个实现ISerializable接口的解决方案中的类。 它有一个GetObjectData方法,用于按接口要求进行序列化。 这里没有发生任何自定义序列化,它只是使用类的属性名称及其值填充SerializationInfo对象。

 [Serializable] public class PersonName :ISerializable { [DataMember] public string NamePrefix { get; set; } [DataMember] public string GivenName { get; set; } [DataMember] public string SurName { get; set; } public PersonName(string givenName, string surName, string namePrefix) { GivenName = givenName; SurName = surName; NamePrefix = namePrefix; } public PersonName() { } #region ISerializable Members public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("NamePrefix",NamePrefix); info.AddValue("GivenName",GivenName); info.AddValue("SurName",SurName); } } 

从我到目前为止阅读的文档中,据我所知,这是用[Serializable]属性标记的类无论如何都会发生的事情,并且你可以看到该类没有反序列化构造函数,这就是为什么我一开始就看着它。 从我所知道的,而不是需要将反序列化构造函数添加到类中,该类实际上不需要首先实现ISerializable接口。 那是对的吗?

这是毫无意义的。

如果出于更好的理由曾经实施过ISerializable ,那么它可能是合理的,而实施变化意味着它不再有用。 停止实施它可能是一个突破性的变化。

如果他们用一个显式实现( void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)而不是public void GetObjectData(SerializationInfo info, StreamingContext context)并且让SerializationInfoStreamingContext私有的构造函数,那么它将是一个破坏性较小的变化 – 在技术上仍然是一个突破性的变化,但实际上破坏任何实际用途的可能性要小得多。这本身就是将该构造函数设为私有的原因。

但是如果类没有被密封,它必须至少protected ,并且派生类必须使用它,如果它们也是可序列化的。 在这种情况下,停止使用它将完全是一个突破性的变化,因为所有派生类将被打破。

如果你没有实现它,它同样会破坏变化,然后开始这样做,并从中派生出类。 这可能是预防这种可能性的理由,但说实话,我认为这是YAGNI原则的一个重大失败,除非有一个非常好的理由怀疑它会变得有用。 (通常,如果你要添加一些必要的东西,你可以在另一个类中包含它所需的任何function,在它上面实现它,并拥有该类型的成员,因此现有的类仍然可以在没有它的情况下进行序列化)。

编辑:上面的“必须”是“必须这样做或者有不良影响”的“必须”,而不是“你必须这样做或者不会编译”的“必须”。 当然,前者比后者更糟糕,因为你有时可能无法做到。

该类实际上不需要首先实现ISerializable接口。 那是对的吗?

正确。 实现ISerializable是指您需要执行除默认序列化行为之外的其他操作。 [Serializable]属性应该足够了。

你可能总是暗示ISerializable。 是的,如果你有很多对象,可能会输入很多东西,但如果你以后引入它,反序列化器会破坏。 我认为对于版本化对象而不是编写新对象并保留旧对象更好。

实现Iserializable可以提高性能,因为不需要使用reflection来序列化对象

需要签名构造函数(SerializationInfo信息,StreamingContext上下文)。 用于反序列化时间。

我看到,实现ISerializable对于这个类不是必需的。或者你必须添加一个带签名的构造函数(SerializationInfo信息,StreamingContext上下文): protected PersonName (SerializationInfo info, StreamingContext context){ this.NamePrefix = info.GetString("NamePrefix"); this.SurName = info.GetString("SurName"); this.GivenName = info.GetString("GivenName"); } protected PersonName (SerializationInfo info, StreamingContext context){ this.NamePrefix = info.GetString("NamePrefix"); this.SurName = info.GetString("SurName"); this.GivenName = info.GetString("GivenName"); }

上述就是C#学习教程:在不实现任何自定义序列化/反序列化时,是否需要实现ISerializable接口分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1033399.html

(0)
上一篇 2022年1月18日
下一篇 2022年1月18日

精彩推荐