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