[System.SerializableAttribute()]做什么

Gra*_*ham 19 c#

我正在寻找别人的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)]
Run Code Online (Sandbox Code Playgroud)

有人可以用简单的英语解释这些行中的每一行是做什么的.

Mar*_*ell 59

这其实非常微妙......

从表面上看,答案就是"它将类添加SerialiableAttribute到类的元数据中",其目的SerializableAttribute是宣传类似的东西(类似的东西BinaryFormatter)可以序列化类型.BinaryFormatter将拒绝序列化未明确通告序列化的内容.这可能是BinaryFormatter用于实现远程处理以及防止数据意外泄漏到远程边界的结果.

请注意,大多数串行不关心有关SerializableAttribute,所以这只能影响事情喜欢BinaryFormatter.例如,没有XmlSerializer,DataContractSerializer,JavaScriptSerializer,JSON.NET或protobuf网真正关心的SerializableAttribute.

实际上,它不是标准属性,而是由编译器进行特殊处理:

  • 大多数属性都是技术上的.custom instance值(以IL表示)
  • SerialiableAttribute实际上映射到CLI .class标志,serializable

这并没有改变含义,但是:作为一个新奇的事实,SerializableAttribute实际上并不是作为属性实现的.

  • Marc,您能详细说明一下 IL 部分吗?这一变化究竟意味着什么?为什么这个属性的处理方式有所不同?谢谢 (2认同)

Cri*_*hes 11

System.SerializableAttribute向运行时指定可以序列化该类的实例

例如.您在WCF服务调用中返回一个对象.如果该对象具有此属性并且其中的所有对象都是可序列化的,则运行时将该对象转换为JSON或XML,具体取决于Web服务返回的资源类型.

  • WCF通常使用`DataContractSerializer`; `DataContractSerializer`实际上并不需要`[Serializable]` - 它更喜欢`[DataContract]` (5认同)

Jam*_*man 7

这只是长手[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";
Run Code Online (Sandbox Code Playgroud)

当序列化为 JSON 结构时,我们得到:

"{'Mem1':'Hello','Mem2':'World'}"
Run Code Online (Sandbox Code Playgroud)

考虑到该过程的双向性质,如果我们收到这种格式的信息(例如从某些 Web 服务返回),那么我们可以愉快地将其序列化回此类的实例。

在 JSON 示例的基础上,我们在命名空间中找到了一系列System.Web.Script.Serialization可以帮助我们完成此任务的类。特别是,该类JavaScriptSerializer帮助我们提供Serialize()方法Deserialize

  • JSON 或 XML 的示例通常使用 JavaScriptSerializer、DataContractSerializer、XmlSerializer 或 JSON.NET;其中没有一个关心“[Serialized]”。 (4认同)