Відповіді:
Коли ви створюєте об’єкт у програмі .Net Framework, вам не потрібно думати про те, як дані зберігаються в пам'яті. Тому що .Net Framework піклується про це для вас. Однак, якщо ви хочете зберегти вміст об'єкта у файлі, надіслати об’єкт в інший процес або передати його по всій мережі, вам доведеться думати про те, як об’єкт представлений, тому що вам потрібно буде конвертувати в інший формат . Ця конверсія називається СЕРІАЛІЗАЦІЯ.
Серіалізація дозволяє розробнику зберігати стан об’єкта і відтворювати його за необхідності, забезпечуючи зберігання об’єктів, а також обмін даними. За допомогою серіалізації розробник може виконувати такі дії, як надсилання об’єкта у віддалений додаток за допомогою веб-сервісу, передача об'єкта з одного домену в інший, передача об'єкта через брандмауер у вигляді рядка XML або підтримка безпеки або специфіки для користувача інформація в додатках.
Застосуйте SerializableAttribute
до типу, щоб вказати, що екземпляри цього типу можуть бути серіалізовані. Застосуйте SerializableAttribute
навіть, якщо клас також реалізує ISerializable
інтерфейс для управління процесом серіалізації.
Усі загальнодоступні та приватні поля типу, які позначені символом SerializableAttribute
, серіалізуються за замовчуванням, за винятком випадків, коли тип реалізує ISerializable
інтерфейс для зміни процесу серіалізації. Процес серіалізації за замовчуванням виключає поля, позначені знаком NonSerializedAttribute
. Якщо поле серіалізаційного типу містить вказівник, ручку чи якусь іншу структуру даних, яка є специфічною для конкретного середовища, і не може бути значимо відновлена в іншому середовищі, то, можливо, ви захочете застосувати NonSerializedAttribute
до цього поля.
Докладнішу інформацію див. У MSDN .
Редагуйте 1
Будь-яка причина не позначати щось як серіалізаційне
Під час передачі чи збереження даних вам потрібно надіслати або зберегти лише необхідні дані. Тож буде менше затримок передачі та проблем із зберіганням. Таким чином, ви можете вимкнути непотрібний фрагмент даних під час серіалізації.
Деякі практичні можливості використання [Serializable]
атрибута:
BinaryFormatter
клас у System.Runtime.Serialization.Formatters.BinaryClipboard.SetData()
- несерійні класи не можна розміщувати у буфері обміну.MarshalByRefObject
), повинен бути серійним.Це найпоширеніші випадки використання, які я стикався.
Оскільки початкове питання стосувалося SerializableAttribute, слід зазначити, що цей атрибут застосовується лише при використанні BinaryFormatter або SoapFormatter.
Це трохи заплутано, якщо ви дійсно не звертаєте увагу на деталі щодо того, коли його використовувати та яке його фактичне призначення.
Це не має нічого спільного з серіалізацією XML або JSON.
Використовуються разом із SerializableAttribute - ISerializable Interface та SerializationInfo Class. Вони також використовуються лише з BinaryFormatter або SoapFormatter.
Якщо ви не збираєтеся серіалізувати свій клас за допомогою Binary або Soap, не переймайтеся маркуванням класу як [Serializable]. XML та JSON серіалізатори навіть не знають про його існування.
Serializable
і без, коли атрибут був видалений. Тож можливе певне втручання.
Серіалізація - це процес перетворення об’єкта в потік байтів з метою збереження об'єкта або передачі його в пам'ять, базу даних або файл.
Як працює серіалізація
Ця ілюстрація показує загальний процес серіалізації.
Об'єкт серіалізується у потік, який несе не лише дані, а й інформацію про тип об'єкта, такі як його версія, культура та назва збірки. З цього потоку він може зберігатися в базі даних, файлі чи пам'яті.
Ось короткий приклад того, як працює серіалізація. Я також дізнався про те саме, і мені було корисно два посилання. Що таке серіалізація та як це можна зробити в .NET .
Зразок програми, що пояснює серіалізацію
Якщо ви не розумієте вищевказану програму набагато проста програма , з поясненням дається тут .
Серіалізація
Серіалізація - це процес перетворення об'єкта або набору графіка об'єктів у потік, це масив байтів у разі двійкової серіалізації
Використання серіалізації
Нижче наведено кілька корисних спеціальних атрибутів, які використовуються під час серіалізації об’єкта
[Serializable] -> Він використовується, коли ми позначаємо серіалізабельність об'єкта [NonSerialized] -> Він використовується, коли ми не хочемо серіалізувати поле об’єкта. [OnSerialization] -> Він використовується, коли ми хочемо виконати якусь дію під час серіалізації об'єкта [OnSerialized] -> Він використовується, коли ми хочемо виконати якусь дію після серіалізації об'єкта в потік.
Нижче наводиться приклад серіалізації
[Serializable]
internal class DemoForSerializable
{
internal string Fname = string.Empty;
internal string Lname = string.Empty;
internal Stream SerializeToMS(DemoForSerializable demo)
{
DemoForSerializable objSer = new DemoForSerializable();
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, objSer);
return ms;
}
[OnSerializing]
private void OnSerializing(StreamingContext context) {
Fname = "sheo";
Lname = "Dayal";
}
[OnSerialized]
private void OnSerialized(StreamingContext context)
{
// Do some work after serialized object
}
}
Ось код виклику
class Program
{
string fname = string.Empty;
string Lname = string.Empty;
static void Main(string[] args)
{
DemoForSerializable demo = new DemoForSerializable();
Stream ms = demo.SerializeToMS(demo);
ms.Position = 0;
DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;
Console.WriteLine(demo1.Fname);
Console.WriteLine(demo1.Lname);
Console.ReadLine();
}
}
What is it?
stackoverflow.com/questions/3429921/what-does-serializable-mean