Я узнал, что некоторые классы используют атрибут [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();
}
}