Я узнал, что некоторые классы используют атрибут [Serializable].
- Что это?
- Когда следует использовать его?
- Какие выгоды я получу?
Я узнал, что некоторые классы используют атрибут [Serializable].
Когда вы создаете объект в приложении .Net framework, вам не нужно думать о том, как данные хранятся в памяти. Потому что .Net Framework позаботится об этом для вас. Однако, если вы хотите сохранить содержимое объекта в файл, отправьте объект другому процессу или передайте его по сети, вам нужно подумать о том, как объект представлен, потому что вам нужно будет преобразовать его в другой формат, Это преобразование называется SERIALIZATION.
Сериализация позволяет разработчику сохранять состояние объекта и воссоздавать его по мере необходимости, обеспечивая хранение объектов, а также обмен данными. Благодаря сериализации разработчик может выполнять такие действия, как отправка объекта в удаленное приложение с помощью веб-службы, передача объекта из одного домена в другой, передача объекта через брандмауэр в виде строки XML или сохранение безопасности или пользовательских информации в приложениях.
Примените SerializableAttribute к типу, чтобы указать, что экземпляры этого типа могут быть сериализованы. Примените SerializableAttribute, даже если класс также реализует ISerializable для управления процессом сериализации.
Все общедоступные и частные поля в типе, отмеченные SerializableAttribute, сериализуются по умолчанию, если только тип не реализует ISerializable, чтобы переопределить процесс сериализации. Процесс сериализации по умолчанию исключает поля, отмеченные NonSerializedAttribute. Если поле сериализуемого типа содержит указатель, дескриптор или какую-либо другую структуру данных, специфичную для конкретной среды, и не может быть осмысленно восстановлено в другой среде, тогда вы можете применить NonSerializedAttribute в это поле.
Подробнее см. MSDN.
Некоторые практические применения для атрибута [Serializable]:
BinaryFormatter в System.Runtime.Serialization.Formatters.BinaryClipboard.SetData() - несериализуемые классы не могут быть помещены в буфер обмена.MarshalByRefObject), должен быть сериализуемым.Это наиболее распространенные случаи использования, с которыми я столкнулся.
Вот краткий пример того, как работает сериализация. Я тоже узнал об этом, и я нашел две полезные ссылки. Что такое Serialization и как это можно сделать в .NET.
Пример программы, объясняющей сериализацию
Если вы не понимаете вышеприведенную программу, простую программу с объяснением дается здесь.
Сериализация - это процесс преобразования объекта в поток байтов, чтобы сохранить объект или передать его в память, базы данных или файла.
Как работает сериализация
На этом рисунке показан общий процесс сериализации.
Объект сериализуется в поток, который несет не только данные, но и информацию о типе объекта, например его версию, культуру и имя сборки. Из этого потока он может быть сохранен в базе данных, файле или в памяти.
Сериализация
Сериализация - это процесс преобразования объекта или набора объектов в поток, это байтовый массив в случае двоичной сериализации
Использование сериализации
Ниже приведены некоторые полезные пользовательские атрибуты, которые используются при сериализации объекта
[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();
        }
    }