做什么

我正在寻找别人的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 。 例如, XmlSerializerDataContractSerializerJavaScriptSerializer ,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方法。

从文档 :

表示可以序列化类

有关示例,请参阅文档。