Ответы:
Когда вы создаете объект в приложении .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