Яка різниця між використанням 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
SetObjectData
MyFoo(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, (де) серіалізація може контролюватися лише атрибутами і є менш гнучкою.