В чем разница между использованием атрибута Serializable
и реализацией интерфейса ISerializable
?
Какая разница между использованием атрибута Serializable и внедрением ISerializable?
Ответ 1
Когда вы используете атрибут SerializableAttribute
, вы помещаете атрибут в поле во время компиляции таким образом, что когда во время выполнения средства сериализации будут знать, что сериализовать на основе атрибутов, отражая тип класса/модуля/сборки.
[Serializable]
public class MyFoo { … }
Вышеупомянутое указывает, что средство сериализации должно сериализовать весь класс MyFoo
, тогда как:
public class MyFoo
{
private int bar;
[Serializable]
public int WhatBar
{
get { return this.bar; }
}
}
Используя атрибут, вы можете выборочно выбирать, какие поля должны быть сериализованы.
Когда вы реализуете ISerializable
, сериализация эффективно переопределяется с помощью специальной версии, путем переопределение GetObjectData
и (и предоставив конструктор form SetObjectData
MyFoo(SerializationInfo info, StreamingContext context)
), будет более тонкая степень контроля за сериализацией данных.
См. также fooobar.com/questions/77978/.... Он показывает, как сохранить сериализацию обратной совместимости с различными версиями сериализованных данных.
Надеюсь, что это поможет.
Ответ 2
SerializableAttribute инструктирует фреймворк выполнить процесс сериализации по умолчанию. Если вам нужно больше контроля, вы можете реализовать интерфейс ISerializable. Затем вы поместите свой собственный код для сериализации объекта в методе GetObjectData
и обновите объект SerializationInfo
, который ему передан.
Ответ 3
Интерфейс ISerializable
позволяет реализовать пользовательскую сериализацию, отличную от стандартной.
Когда вы реализуете интерфейс ISerializable
, вам необходимо переопределить метод GetObjectData
следующим образом
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
Ответ 4
Измерить заставляют вас внедрять логику сериализации вручную, в то время как маркировка с помощью атрибута Serializable (вы это имели в виду?) сообщит бинарный сериализатор, что этот класс может быть сериализован. Он будет делать это автоматически.
Ответ 5
Наследование от ISerializable позволяет вам выполнить сериализацию (de). При использовании только атрибута Serializable сериализация (de) может управляться только по атрибутам и менее гибка.