Ответы:
Когда вы создаете объект в приложении .Net Framework, вам не нужно думать о том, как данные хранятся в памяти. Потому что .Net Framework позаботится об этом за вас. Однако, если вы хотите сохранить содержимое объекта в файл, отправить объект другому процессу или передать его по сети, вам нужно подумать о том, как представлен объект, потому что вам нужно будет преобразовать его в другой формат. , Это преобразование называется СЕРИАЛИЗАЦИЯ.
Сериализация позволяет разработчику сохранять состояние объекта и воссоздавать его по мере необходимости, обеспечивая хранение объектов, а также обмен данными. Посредством сериализации разработчик может выполнять такие действия, как отправка объекта в удаленное приложение с помощью веб-службы, передача объекта из одного домена в другой, передача объекта через брандмауэр в виде строки XML или поддержание безопасности или пользовательского уровня. информация между приложениями.
Применить SerializableAttribute
к типу, чтобы указать, что экземпляры этого типа могут быть сериализованы. Примените SerializableAttribute
даже если класс также реализуетISerializable
интерфейс для управления процессом сериализации.
Все открытые и закрытые поля в типе, помеченные SerializableAttribute
символом, сериализуются по умолчанию, если только тип не реализует ISerializable
интерфейс для переопределения процесса сериализации. Процесс сериализации по умолчанию исключает поля, отмеченные значком NonSerializedAttribute
. Если поле сериализуемого типа содержит указатель, дескриптор или некоторую другую структуру данных, которая специфична для конкретной среды и не может быть разумно восстановлена в другой среде, тогда вы можете применить NonSerializedAttribute
к этому полю.
Смотрите MSDN для более подробной информации.
Редактировать 1
Любая причина не помечать что-то как сериализуемый
При передаче или сохранении данных вам нужно отправлять или сохранять только необходимые данные. Таким образом, будет меньше задержек передачи и проблем с хранением. Таким образом, вы можете отказаться от ненужного куска данных при сериализации.
Некоторые практические применения для [Serializable]
атрибута:
BinaryFormatter
класс в System.Runtime.Serialization.Formatters.BinaryClipboard.SetData()
- несериализуемые классы не могут быть помещены в буфер обмена.MarshalByRefObject
), должен быть сериализуемым.Это наиболее распространенные случаи использования, с которыми я сталкивался.
Поскольку первоначальный вопрос касался атрибута SerializableAttribute, следует отметить, что этот атрибут применяется только при использовании BinaryFormatter или SoapFormatter.
Это немного сбивает с толку, если вы действительно не обращаете внимание на детали, когда и как его использовать и какова его реальная цель.
Это НИЧЕГО не связано с сериализацией XML или JSON.
С SerializableAttribute используются интерфейс ISerializable и класс SerializationInfo. Они также используются только с BinaryFormatter или SoapFormatter.
Если вы не собираетесь сериализовать свой класс с использованием Binary или Soap, не пытайтесь пометить свой класс как [Serializable]. Сериализаторы XML и JSON даже не знают о его существовании.
Serializable
, и без, когда атрибут был удален. Так что некоторые помехи возможны.
Сериализация - это процесс преобразования объекта в поток байтов, чтобы сохранить объект или передать его в память, базу данных или файл.
Как работает сериализация
На этом рисунке показан общий процесс сериализации.
Объект сериализуется в поток, который переносит не только данные, но и информацию о типе объекта, например его версию, культуру и имя сборки. Из этого потока он может быть сохранен в базе данных, файле или памяти.
Вот краткий пример того, как работает сериализация. Я также узнал об этом и нашел две полезные ссылки. Что такое сериализация и как это можно сделать в .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();
}
}
What is it?
stackoverflow.com/questions/3429921/what-does-serializable-mean