Что такое [Сериализуемый] и когда я должен его использовать? - PullRequest
296 голосов
/ 04 мая 2011

Я обнаружил, что некоторые классы используют атрибут [Serializable].

  • Что это?
  • Когда мне его использовать?
  • Какие преимущества я получу?

Ответы [ 6 ]

351 голосов
/ 04 мая 2011

Что это?

Когда вы создаете объект в приложении .Net Framework, вам не нужно думать о том, как данные хранятся в памяти. Потому что .Net Framework позаботится об этом за вас. Однако, если вы хотите сохранить содержимое объекта в файл, отправить объект другому процессу или передать его по сети, вам нужно подумать о том, как представлен объект, потому что вам нужно будет преобразовать его в другой формат. , Это преобразование называется СЕРИАЛИЗАЦИЯ.

Использование для сериализации

Сериализация позволяет разработчику сохранять состояние объекта и воссоздавать его по мере необходимости, обеспечивая хранение объектов, а также обмен данными. Посредством сериализации разработчик может выполнять такие действия, как отправка объекта в удаленное приложение с помощью веб-службы, передача объекта из одного домена в другой, передача объекта через брандмауэр в виде строки XML или поддержание безопасности или специфичных для пользователя информация между приложениями.

Применить SerializableAttribute к типу, чтобы указать, что экземпляры этого типа могут быть сериализованы. Примените SerializableAttribute, даже если класс также реализует интерфейс ISerializable для управления процессом сериализации.

Все открытые и закрытые поля в типе, помеченные SerializableAttribute, по умолчанию сериализуются, если только тип не реализует интерфейс ISerializable для переопределения сериализации. процесс. Процесс сериализации по умолчанию исключает поля, отмеченные NonSerializedAttribute. Если поле сериализуемого типа содержит указатель, дескриптор или некоторую другую структуру данных, специфичную для конкретной среды и не может быть разумно восстановлена ​​в другой среде, тогда вы можете применить NonSerializedAttribute в это поле.

Подробнее см. MSDN .

Редактировать 1

Любая причина не помечать что-либо как сериализуемое

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

38 голосов
/ 04 мая 2011

Некоторые практические применения для атрибута [Serializable]:

  • Сохранение состояния объекта с помощью двоичной сериализации; вы можете очень легко «сохранить» все экземпляры объектов в вашем приложении в файл или сетевой поток, а затем воссоздать их путем десериализации - посмотрите класс BinaryFormatter в System.Runtime.Serialization.Formatters.Binary
  • Написание классов, экземпляры объектов которых могут быть сохранены в буфере обмена с использованием Clipboard.SetData() - несериализуемые классы не могут быть помещены в буфер обмена.
  • Написание классов, совместимых с .NET Remoting; как правило, любой экземпляр класса, который вы передаете между доменами приложения (кроме тех, которые выходят из MarshalByRefObject), должен быть сериализуемым.

Это наиболее распространенные случаи использования, с которыми мне приходилось сталкиваться.

26 голосов
/ 22 июня 2018

Поскольку исходный вопрос касался атрибута SerializableAttribute, следует отметить, что этот атрибут применяется только при использовании BinaryFormatter или SoapFormatter.

Это немного сбивает с толку, если вы действительно не обращаете внимание на детали, когда и как его использовать, и каково его реальное назначение.

НИЧЕГО не имеет ничего общего с сериализацией XML или JSON.

В качестве атрибута SerializableAttribute используются интерфейс ISerializable и класс SerializationInfo. Они также используются только с BinaryFormatter или SoapFormatter.

Если вы не собираетесь сериализовать свой класс с использованием Binary или Soap, не пытайтесь пометить свой класс как [Serializable]. Сериализаторы XML и JSON даже не знают о его существовании.

25 голосов
/ 05 января 2017

Сериализация - это процесс преобразования объекта в поток байты, чтобы сохранить объект или передать его в память, база данных или файл.

Как работает сериализация

На этом рисунке показан общий процесс сериализации.

enter image description here

Объект сериализуется в поток, который несет не только данные, но и информацию о типе объекта, например его версию, культуру и имя сборки. Из этого потока он может храниться в базе данных, файле или памяти.

Подробности в MSDN.

18 голосов
/ 12 декабря 2012

Вот краткий пример того, как работает сериализация. Я также узнал об этом и нашел две полезные ссылки. Что такое сериализация и как это можно сделать в .NET .

Пример программы, объясняющей сериализацию

Если вы не понимаете вышеупомянутую программу, очень простая программа с объяснением будет дана здесь .

12 голосов
/ 10 апреля 2017

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

Сериализация - это процесс преобразования графа объекта или набора объектов в поток, это массив байтов в случае двоичной сериализации

Использование сериализации

  1. Чтобы сохранить состояние объекта в файл, базу данных и т. Д. И использовать его позднее.
  2. Чтобы отправить объект из одного процесса в другой (домен приложения) на том же компьютере, а также отправить его по проводам процессу, работающему на другом компьютере.
  3. Чтобы создать клон исходного объекта в качестве резервной копии при работе с основным объектом.
  4. Набор объектов можно легко скопировать в буфер обмена системы, а затем вставить в то же или другое приложение

Ниже приведены некоторые полезные пользовательские атрибуты, которые используются при сериализации объекта

[Serializable] -> Используется, когда мы отмечаем сериализуемый объект [NonSerialized] -> Используется, когда мы не хотим сериализовать поле объекта. [OnSerializing] -> Используется, когда мы хотим выполнить какое-то действие при сериализации объекта [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();
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...