Що таке [Serializable] і коли я повинен його використовувати?


318

Я дізнався, що деякі класи використовують [Serializable]атрибут.

  • Що це?
  • Коли я повинен його використовувати?
  • Які вигоди я отримаю?



1
Ось практичне пояснення використання я знайшов.
Ніпуна

Відповіді:


369

Що це?

Коли ви створюєте об’єкт у програмі .Net Framework, вам не потрібно думати про те, як дані зберігаються в пам'яті. Тому що .Net Framework піклується про це для вас. Однак, якщо ви хочете зберегти вміст об'єкта у файлі, надіслати об’єкт в інший процес або передати його по всій мережі, вам доведеться думати про те, як об’єкт представлений, тому що вам потрібно буде конвертувати в інший формат . Ця конверсія називається СЕРІАЛІЗАЦІЯ.

Використання для серіалізації

Серіалізація дозволяє розробнику зберігати стан об’єкта і відтворювати його за необхідності, забезпечуючи зберігання об’єктів, а також обмін даними. За допомогою серіалізації розробник може виконувати такі дії, як надсилання об’єкта у віддалений додаток за допомогою веб-сервісу, передача об'єкта з одного домену в інший, передача об'єкта через брандмауер у вигляді рядка XML або підтримка безпеки або специфіки для користувача інформація в додатках.

Застосуйте SerializableAttributeдо типу, щоб вказати, що екземпляри цього типу можуть бути серіалізовані. Застосуйте SerializableAttributeнавіть, якщо клас також реалізує ISerializableінтерфейс для управління процесом серіалізації.

Усі загальнодоступні та приватні поля типу, які позначені символом SerializableAttribute, серіалізуються за замовчуванням, за винятком випадків, коли тип реалізує ISerializableінтерфейс для зміни процесу серіалізації. Процес серіалізації за замовчуванням виключає поля, позначені знаком NonSerializedAttribute. Якщо поле серіалізаційного типу містить вказівник, ручку чи якусь іншу структуру даних, яка є специфічною для конкретного середовища, і не може бути значимо відновлена ​​в іншому середовищі, то, можливо, ви захочете застосувати NonSerializedAttributeдо цього поля.

Докладнішу інформацію див. У MSDN .

Редагуйте 1

Будь-яка причина не позначати щось як серіалізаційне

Під час передачі чи збереження даних вам потрібно надіслати або зберегти лише необхідні дані. Тож буде менше затримок передачі та проблем із зберіганням. Таким чином, ви можете вимкнути непотрібний фрагмент даних під час серіалізації.


1
@dwbartz На ваше запитання відповідає посилання
jayasurya_j

2
Приємне пояснення, було б добре додати це до атрибуту в MSDN =)
Martea

@jayasurya_j Шкода, що прийнята відповідь не дуже говорить про приватні частини
Олександр

1
Хороше пояснення
Закір ХК

42

Деякі практичні можливості використання [Serializable]атрибута:

  • Збереження стану об'єкта за допомогою двійкової серіалізації; ви можете дуже легко "зберегти" цілі екземпляри об'єктів у вашій програмі до файлу або мережевого потоку, а потім відтворити їх шляхом десеріалізації - перевірте BinaryFormatterклас у System.Runtime.Serialization.Formatters.Binary
  • Класи письма, екземпляри яких об'єкти можна зберігати у буфері обміну за допомогою Clipboard.SetData()- несерійні класи не можна розміщувати у буфері обміну.
  • Класи письма, сумісні з .NET Remoting; як правило, будь-який екземпляр класу, який ви переходите між доменами додатків (крім тих, що поширюються на MarshalByRefObject), повинен бути серійним.

Це найпоширеніші випадки використання, які я стикався.


41

Оскільки початкове питання стосувалося SerializableAttribute, слід зазначити, що цей атрибут застосовується лише при використанні BinaryFormatter або SoapFormatter.

Це трохи заплутано, якщо ви дійсно не звертаєте увагу на деталі щодо того, коли його використовувати та яке його фактичне призначення.

Це не має нічого спільного з серіалізацією XML або JSON.

Використовуються разом із SerializableAttribute - ISerializable Interface та SerializationInfo Class. Вони також використовуються лише з BinaryFormatter або SoapFormatter.

Якщо ви не збираєтеся серіалізувати свій клас за допомогою Binary або Soap, не переймайтеся маркуванням класу як [Serializable]. XML та JSON серіалізатори навіть не знають про його існування.


16
"НІЧОГО стосунку до серіалізації XML чи JSON" - ДЯКУЙТЕ! Нарешті пояснення, чому я можу із задоволенням серіалізувати будь-який клас до XML з цим атрибутом або без нього
userSteve

1
У вас є джерело для цього?
Міхель ван

"XML і JSON серіалізатори навіть не знають про його існування". Я не знаю про це. Коли я JSON відформатував клас через WCF, імена властивостей вийшли з попереднім підкресленням, якщо клас був Serializableі без, коли атрибут був видалений. Тож можливе певне втручання.
Єнс

@Jens, якщо я правильно зрозумів, JSON.net не хвилюється, але asp.net трохи змінює цю поведінку. Я вважаю, що ви можете обійти це за допомогою атрибутів JsonObject / JsonProperty.
База

29

Серіалізація - це процес перетворення об’єкта в потік байтів з метою збереження об'єкта або передачі його в пам'ять, базу даних або файл.

Як працює серіалізація

Ця ілюстрація показує загальний процес серіалізації.

введіть тут опис зображення

Об'єкт серіалізується у потік, який несе не лише дані, а й інформацію про тип об'єкта, такі як його версія, культура та назва збірки. З цього потоку він може зберігатися в базі даних, файлі чи пам'яті.

Деталі в msdn.


19

Ось короткий приклад того, як працює серіалізація. Я також дізнався про те саме, і мені було корисно два посилання. Що таке серіалізація та як це можна зробити в .NET .

Зразок програми, що пояснює серіалізацію

Якщо ви не розумієте вищевказану програму набагато проста програма , з поясненням дається тут .


14

Серіалізація

Серіалізація - це процес перетворення об'єкта або набору графіка об'єктів у потік, це масив байтів у разі двійкової серіалізації

Використання серіалізації

  1. Щоб зберегти стан об'єкта у файлі, базі даних тощо та використовувати його останнє.
  2. Щоб надіслати об'єкт з одного процесу в інший (Домен додатка) на одній машині, а також надіслати його по дроту до процесу, який працює на іншій машині.
  3. Створити клон вихідного об’єкта як резервного копіювання під час роботи над головним об’єктом.
  4. Набір об'єктів легко можна скопіювати у буфер обміну системи та потім вставити у ту саму чи іншу програму

Нижче наведено кілька корисних спеціальних атрибутів, які використовуються під час серіалізації об’єкта

[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();
        }

    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.