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

StackOverflow https://stackoverflow.com/questions/2365152

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top