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

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

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

6 ответов


что это?

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

использует для сериализации

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

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

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

посмотреть MSDN более подробный.

изменить 1

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

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


некоторые практические применения :

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

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


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

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

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

enter image description here

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

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


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

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

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


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

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

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

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

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

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

    }

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

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

Это не имеет ничего общего с сериализацией XML или JSON.

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

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