做什么
我正在寻找别人的C#代码,在公开枚举之前有以下几行:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
有人可以用简单的英语解释这些行中的每一行是做什么的。
System.SerializableAttribute向运行时指定可以序列化该类的实例
例如。 您在WCF服务调用中返回一个对象。 如果该对象具有此属性并且其中的所有对象都是可序列化的,则运行时将该对象转换为JSON或XML,具体取决于Web服务返回的资源类型。
这其实非常微妙……
从表面上看 ,答案就是“它将SerialiableAttribute
添加到类的元数据中”,其中SerializableAttribute
的目的是通告(如BinaryFormatter
)类型可以序列化。 BinaryFormatter
将拒绝序列化未明确通告序列化的内容。 这可能是BinaryFormatter
用于实现远程处理以及防止数据意外泄漏到远程边界的结果。
请注意,大多数序列化程序不关心 SerializableAttribute
,因此这只会影响BinaryFormatter
。 例如, XmlSerializer
, DataContractSerializer
, JavaScriptSerializer
,JSON.NET或protobuf-net都不关心SerializableAttribute
。
但实际上 ,它不是标准属性,而是由编译器进行特殊处理:
- 大多数属性在技术上都是
.custom instance
值(以IL表示) - 但是,
SerialiableAttribute
实际上映射到CLI.class
标志,可serializable
这并没有改变含义 ,但是:作为一个新奇事实, SerializableAttribute
实际上并不是作为属性实现的。
这对[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'}"
鉴于该过程的双向性,如果我们收到这种格式的信息(例如,从某些Web服务返回),那么我们可以愉快地将其序列化为该类的实例。
在JSON示例的基础上,我们在命名空间System.Web.Script.Serialization
中找到了一系列可以帮助我们解决这个问题的类。 特别是, JavaScriptSerializer
类帮助我们提供Serialize()
和Deserialize
方法。
从文档 :
表示可以序列化类
有关示例,请参阅文档。