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

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

5 ответов


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

[Serializable]
public class MyFoo { … }

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

public class MyFoo
{
    private int bar;

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

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

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

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

надеюсь, что это помогает.


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


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

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

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


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