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

jay*_*won 13 c# serialization

我正在寻找一个实现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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

vcs*_*nes 14

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

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


Jon*_*nna 8

这是毫无意义的.

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

他们要是有一个明确的实现(实现了它void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context),而不是public void GetObjectData(SerializationInfo info, StreamingContext context)和有这样的花的构造SerializationInfoStreamingContext私有的,那么它会是一个不太破坏性的变化-技术上仍重大更改,但不太可能真正打破任何实际用途这本身就是将构造函数设为私有的原因.

必须至少protected如果类没有被密封,并且派生类必须使用它,如果它们也是可序列化的.在这种情况下,停止使用它将彻底改变,因为所有派生类都将被破坏.

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

编辑:" 必须 "上面是的"你必须这样做,或者有不好的影响",而不是"一定""必须的","你必须这样做,否则将无法编译".当然,前者比后者更糟糕,因为你有时候可能做不到.