В чем разница между использованием атрибута Serializable и реализацией ISerializable? - PullRequest
73 голосов
/ 02 марта 2010

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

Ответы [ 5 ]

41 голосов
/ 02 марта 2010

Когда вы используете атрибут 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 . В нем показано, как обеспечить обратную совместимость сериализации с различными версиями сериализованных данных.

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

20 голосов
/ 02 марта 2010

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

3 голосов
/ 02 марта 2010

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

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}
1 голос
/ 02 марта 2010

ISerialize вынуждает вас реализовывать логику сериализации вручную, а пометка атрибутом Serializable (вы это имели в виду?) Сообщит Binary serializer, что этот класс можно сериализовать. Это будет сделано автоматически.

0 голосов
/ 02 марта 2010

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

...