Что [Serializable] и когда я должен его использовать?

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

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

Ответ 1

Что это такое?

Когда вы создаете объект в приложении .Net framework, вам не нужно думать о том, как данные хранятся в памяти. Потому что .Net Framework позаботится об этом для вас. Однако, если вы хотите сохранить содержимое объекта в файл, отправьте объект другому процессу или передайте его по сети, вам нужно подумать о том, как объект представлен, потому что вам нужно будет преобразовать его в другой формат, Это преобразование называется SERIALIZATION.

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

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

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

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

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

    }