Яка різниця між використанням Serializableатрибута та реалізацією ISerializableінтерфейсу?
Яка різниця між використанням Serializableатрибута та реалізацією ISerializableінтерфейсу?
Відповіді:
Коли ви використовуєте SerializableAttributeатрибут, ви розміщуєте атрибут у полі під час компіляції таким чином, що під час виконання, засоби серіалізації знатимуть, що серіалізувати на основі атрибутів, виконуючи роздуми про клас / модуль / збірку типу.
[Serializable]
public class MyFoo { … }
Вищезазначене вказує на те, що засіб серіалізації має серіалізувати весь клас MyFoo, тоді як:
public class MyFoo
{
private int bar;
[Serializable]
public int WhatBar
{
get { return this.bar; }
}
}
Використовуючи атрибут, ви можете вибірково вибрати, які поля потрібно серіалізувати.
Коли ви реалізуєте ISerializableінтерфейс , серіалізація фактично замінюється на користувацьку версію, замінюючи і (і надаючи конструктор форми ), буде вищий ступінь контролю над серіалізацією даних.GetObjectData SetObjectDataMyFoo(SerializationInfo info, StreamingContext context)
Дивіться також цей приклад користувацької серіалізації тут, на StackOverflow . Він показує, як зберегти серіалізацію зворотньо сумісною з різними версіями серіалізованих даних.
Сподіваюся, це допомагає.
Serializableатрибут до властивості? MSDN каже, що його можна застосовувати лише до класів, структур, переліків та делегатів.
SerializableAttribute, член може бути позначений, NonSerializedAttributeщоб його пропустити, як сказали багато людей (і MSDN), коли реконструкція певного об’єкта безглузда в іншому середовищі, розумно не проводити його серіалізацію. ..
SerializableAttribute інструктує рамки , щоб зробити процес серіалізациі за замовчуванням. Якщо вам потрібен додатковий контроль, ви можете застосувати інтерфейс ISerializable . Потім ви б розмістили власний код для серіалізації об’єкта в GetObjectDataметоді та оновлення SerializationInfoоб’єкта, який йому передано.
ISerializableІнтерфейс дозволяє реалізувати власні сериализации , крім по замовчуванням. Коли ви реалізуєте ISerializableінтерфейс, вам доведеться перевизначити GetObjectDataметод наступним чином
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
Успадкування від ISerializable дозволяє спеціально реалізувати (де) серіалізацію. Використовуючи лише атрибут Serializable, (де) серіалізація може контролюватися лише атрибутами і є менш гнучкою.