Каково различие между использованием Serializable
атрибут и реализация ISerializable
интерфейс?
Когда вы используете атрибут 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 . Он показывает, как сохранить обратную совместимость сериализации с различными версиями сериализованных данных.
Надеюсь, это поможет.
Интерфейс ISerializable
позволяет реализовать настраиваемую сериализацию , отличную от стандартной.
При реализации интерфейс ISerializable
, вы должны переопределить метод GetObjectData
следующим образом
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
Атрибут SerializableAttribute указывает фреймворку выполнять процесс сериализации по умолчанию. Если вам нужно больше контроля, вы можете реализовать интерфейс ISerializable. Тогда вы поместите свой собственный код для сериализации объекта в метод GetObjectData
и обновите передаваемый ему объект SerializationInfo
.
ISerialize заставляет вас реализовывать логику сериализации вручную, в то время как маркировка атрибутом Serializable (вы это имели в виду?) скажет сериализатору Binary, что этот класс может быть сериализован. Он сделает это автоматически.
Наследование от ISerializable позволяет настраивать реализацию (де) сериализации. При использовании только атрибута Serializable (де) сериализацией можно управлять только с помощью атрибутов, что делает ее менее гибкой.