Подтвердить что ты не робот

Является ли интерфейс 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 в первую очередь. Это правильно?

4b9b3361

Ответ 1

Это довольно бессмысленно.

Это может быть оправдано, если он когда-то реализовал ISerializable по лучшей причине, а изменения в реализации означали, что он уже не так полезен. Это может быть потрясающее изменение, чтобы прекратить его реализацию.

Если бы они реализовали его с явной реализацией (void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context), а не public void GetObjectData(SerializationInfo info, StreamingContext context)) и имели конструктор, который принял SerializationInfo и StreamingContext private, тогда это будет менее разрушительное изменение - по-прежнему технически но гораздо менее вероятно, чтобы фактически нарушить любое реальное использование. Это само по себе является причиной того, что этот конструктор является частным.

Он должен быть хотя бы protected, если класс не запечатан, и производные классы должны использовать его, если они также должны быть сериализованы. В этом случае он полностью изменится, чтобы перестать использовать его, так как все производные классы будут затем разбиты.

Это также изменило бы изменения, если бы вы не реализовали его, а затем начали делать это и получили от него классы. Это может быть оправданием для предпосылки возможности, хотя, честно говоря, я бы увидел это как серьезный провал принципа YAGNI, если не было очень веских оснований подозревать, что это станет полезным. (Как правило, если вы собираетесь добавить что-то, что сделало бы это необходимым, вы могли бы обернуть все функции, которые требуются в другом классе, реализовать его на этом и иметь член этого типа, поэтому существующий класс все равно может быть сериализован без него).

Изменить: "must" выше - это "must" из "вы должны это сделать или есть плохие последствия", а не "must" из "вы должны это сделать или не будете компилировать". Конечно, первые хуже, чем последние, потому что иногда вы не можете их сделать.

Ответ 2

классу действительно не нужно реализовывать интерфейс ISerializable в первую очередь. Это правильно?

Правильно. Реализация ISerializable - это когда вам нужно что-то делать, кроме поведения сериализации по умолчанию. Атрибут [Serializable] должен быть достаточным.

Ответ 3

Вы могли бы также всегда внедрять ISerializable. Да, это может быть много набрав, если у вас много объектов, но десериализатор сломается, если вы позже его представите. Я думаю, что лучше для версий объектов вместо написания новых и сохранения старых.

Ответ 4

Реализация Iserializable дает улучшение производительности, потому что нет необходимости использовать отражение для сериализации объекта

Ответ 5

Требуется конструктор подписи (информация SerializationInfo, контекст StreamingContext). для времени десериализации.

Ответ 6

Я вижу, реализация ISerializable не требуется для этого класса. Или вы должны добавить конструктор с сигнатурой (информация SerializationInfo, контекст StreamingContext): protected PersonName (SerializationInfo info, StreamingContext context){ this.NamePrefix = info.GetString("NamePrefix"); this.SurName = info.GetString("SurName"); this.GivenName = info.GetString("GivenName"); }