Какая разница между использованием атрибута Serializable и внедрением ISerializable?

В чем разница между использованием атрибута Serializable и реализацией интерфейса ISerializable?

Ответ 1

Когда вы используете атрибут SerializableAttribute, вы помещаете атрибут в поле во время компиляции таким образом, что когда во время выполнения средства сериализации будут знать, что сериализовать на основе атрибутов, отражая тип класса/модуля/сборки.

[Serializable]
public class MyFoo { … }

Вышеупомянутое указывает, что средство сериализации должно сериализовать весь класс MyFoo, тогда как:

public class MyFoo
{
    private int bar;

    [Serializable]
    public int WhatBar
    {
       get { return this.bar; }
    }
}

Используя атрибут, вы можете выборочно выбирать, какие поля должны быть сериализованы.

Когда вы реализуете ISerializable, сериализация эффективно переопределяется с помощью специальной версии, путем переопределение GetObjectData и SetObjectData (и предоставив конструктор form MyFoo(SerializationInfo info, StreamingContext context)), будет более тонкая степень контроля за сериализацией данных.

См. также fooobar.com/questions/77978/.... Он показывает, как сохранить сериализацию обратной совместимости с различными версиями сериализованных данных.

Надеюсь, что это поможет.

Ответ 2

SerializableAttribute инструктирует фреймворк выполнить процесс сериализации по умолчанию. Если вам нужно больше контроля, вы можете реализовать интерфейс ISerializable. Затем вы поместите свой собственный код для сериализации объекта в методе GetObjectData и обновите объект SerializationInfo, который ему передан.

Ответ 3

Интерфейс ISerializable позволяет реализовать пользовательскую сериализацию, отличную от стандартной. Когда вы реализуете интерфейс ISerializable, вам необходимо переопределить метод GetObjectData следующим образом

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}

Ответ 4

Измерить заставляют вас внедрять логику сериализации вручную, в то время как маркировка с помощью атрибута Serializable (вы это имели в виду?) сообщит бинарный сериализатор, что этот класс может быть сериализован. Он будет делать это автоматически.

Ответ 5

Наследование от ISerializable позволяет вам выполнить сериализацию (de). При использовании только атрибута Serializable сериализация (de) может управляться только по атрибутам и менее гибка.