C#学习教程:没有实现任何自定义序列化/反序列化的时候,是否需要实现ISerializable接口?我正在寻找实现ISerializable接口的解决方案中的类。它有一个GetObjectData方法,用于根据接口的要求进行序列化。这里没有自定义序列化,它只是用类的属性名称及其值填充SerializationInfo对象。[Serializable]publicclassPersonName:ISerializable{[DataMember]publicstringNamePrefix{get;放;}[DataMember]publicstringGivenName{get;放;}[DataMember]publicstringSurName{get;放;}publicPersonName(stringgivenName,stringsurName,stringnamePrefix){GivenName=givenName;姓氏=姓氏;名称前缀=名称前缀;}publicPersonName(){}#regionISerializableMemberspublicvoidGetObjectData(SerializationInfoinfo,StreamingContextcontext){info.AddValue("NamePrefix",NamePrefix);info.AddValue("GivenName",GivenName);info.AddValue("姓氏",姓氏);从我到目前为止阅读的文档中,据我所知,这标有[Serializable]属性无论如何都会发生,并且您可以看到该类没有反序列化构造函数,它这就是我首先查看它的原因。据我所知,不需要向类添加反序列化构造函数,该类实际上不需要首先实现ISerializable接口。是对的吗?没有用。ISerializable可能是合理的,如果它出于更好的原因而被实现一次,并且实现更改意味着它不再有用。停止实施它可能是一个重大变化。如果他们使用显式实现(voidISerializable.GetObjectData(SerializationInfoinfo,StreamingContextcontext)而不是publicvoidGetObjectData(SerializationInfoinfo,StreamingContextcontext)并将SerializationInfo和StreamingContext的构造函数设为私有-从技术上讲仍然是一个重大变化,但实际上破坏任何实际使用的可能性要小得多。这本身就是将该构造函数设为私有的原因。但是如果该类不是密封的,则它必须至少受到保护,并且派生类必须使用它,如果它们也是可序列化的.Inthiscase,stopusingitwouldbeabreakingchangetostopusingit,asallderivedclasseswouldbebroken.Ifyoudon'timplementit,itwouldsimilarlybreakchanges,然后开始这样做,并从中派生类。这可能是防范这种可能性的一个原因,但老实说,我认为这是YAGNI原则的重大失败,除非有充分的理由怀疑它是否有用。(通常,如果你要添加一些必要的东西,你可以在另一个类中包含它需要的任何功能,在它上面实现它,并且有那个类型的成员,所以现在有些类没有它仍然可以被序列化)。编辑:上面的“必须”是“必须这样做否则会产生不良影响”的“必须”,而不是“你必须这样做否则它不会编译”当然,前者比后者差,因为你有时可能做不到。该类实际上不需要首先实现ISerializable接口。那是对的吗?正确的。实现ISerializable意味着除了默认的Other操作之外,您还需要实现除序列化行为之外的任何其他操作。[Serializable]属性应该足够了。您可能总是暗示ISerializable。是的,如果你有很多对象,可能需要输入很多,但如果你稍后再引入它,反序列化器就会崩溃。我认为对对象进行版本控制比编写新对象并保留旧对象更好。实现Iserializable可以提高性能,因为不需要使用反射来序列化对象。需要签名构造函数(SerializationInfo信息、StreamingContext上下文)。用于反序列化时间。我看到这个类不需要实现ISerializable。或者你必须添加一个带有签名的构造函数(SerializationInfo信息,StreamingContext上下文):this.SurName=info.GetString("姓氏");this.GivenName=info.GetString("GivenName");}protectedPersonName(SerializationInfoinfo,StreamingContextcontext){this.NamePrefix=info.GetString("NamePrefix");this.SurName=info.GetString("姓氏");this.GivenName=info.GetString("GivenName");}以上是C#学习教程:在不实现任何自定义序列化/反序列化的情况下,是否需要实现ISerializable接口共享的所有内容?大家有用,需要多了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
