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

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

73
задан Chris Mantle 2 June 2015 в 11:05
поделиться

5 ответов

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

[Serializable]
public class MyFoo { … }

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

public class MyFoo
{
    private int bar;

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

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

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

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

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

41
ответ дан 24 November 2019 в 12:25
поделиться

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

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}
3
ответ дан 24 November 2019 в 12:25
поделиться

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

20
ответ дан 24 November 2019 в 12:25
поделиться

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

1
ответ дан 24 November 2019 в 12:25
поделиться

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

0
ответ дан 24 November 2019 в 12:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: