Что делает [System.SerializableAttribute()]
Я смотрю на кого-то код С# elses и перед публичным перечислением появляются следующие строки:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
Может кто-нибудь объяснить простым английским языком, что делают каждая из этих строк.
Ответы
Ответ 1
System.SerializableAttribute указывает на среду выполнения, что экземпляры этого класса могут быть сериализованы
Eg. Вы возвращаете объект в вызове службы WCF. Если этот объект имеет этот атрибут, и все объекты внутри него сериализуемы, среда выполнения преобразует этот объект в JSON или XML, в зависимости от типа ресурса, возвращаемого веб-службой.
Ответ 2
Это на самом деле довольно тонкий...
На первый взгляд, ответ просто "он добавляет SerialiableAttribute
к метаданным для класса", где целью SerializableAttribute
является реклама (для таких вещей, как BinaryFormatter
), что тип может быть сериализован, BinaryFormatter
откажется сериализовать вещи, которые явно не рекламируются для сериализации. Это может быть следствием BinaryFormatter
, используемого для реализации удаленных операций, и предотвращения случайного утечки данных на границу удаленного доступа.
Обратите внимание, что большинство сериализаторов не заботятся о SerializableAttribute
, поэтому это влияет только на такие вещи, как BinaryFormatter
. Например, ни один из XmlSerializer
, DataContractSerializer
, JavaScriptSerializer
, JSON.NET или protobuf-net действительно не заботится о SerializableAttribute
.
Однако на самом деле он является не стандартным атрибутом, но имеет специальную обработку компилятором:
- большинство атрибутов являются технически
.custom instance
значениями (в терминах IL)
- однако
SerialiableAttribute
фактически отображает флаг CLI .class
, serializable
Это не меняет смысла, но: как факт новизны, SerializableAttribute
на самом деле не реализуется как атрибут.
Ответ 3
Это просто длинно для [Serializable]
. Он маркирует класс как тот, который может быть "преобразован" в и из других форматов.
Общие примеры включают "Сериализация" класса "в" структуру данных JSON или XML, а также эквивалентное преобразование "из" таких структур.
Рассмотрим класс
[Serializable]
class MyClass
{
public string Mem1 {get; set;}
public string Mem2 {get; set;}
}
...
MyClass mc = new MyClass;
mc.Mem1 = "Hello";
mc.Mem2 = "World";
После сериализации в структуру JSON мы получаем:
"{'Mem1':'Hello','Mem2':'World'}"
И учитывая двухстороннюю природу процесса, если мы получили информацию этого формата (например, обратно из какой-либо веб-службы), тогда мы могли бы с удовольствием перевести его в экземпляр этого класса.
Основываясь на примере JSON, мы найдем серию классов в пространстве имен System.Web.Script.Serialization
, которые могут помочь нам в этом. В частности, класс JavaScriptSerializer
помогает нам с предоставлением методов Serialize()
и Deserialize
.
Ответ 4
Из документация:
Указывает, что класс может быть сериализован
См. документацию для примера.