23

我正在查看其他人的 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)]

有人可以用简单的英语解释这SerializableAttribute条线是做什么的吗?

我已经看到了这个页面——这对我来说没有多大意义——我是 C# 的新手。

4

4 回答 4

69

这其实很微妙……

从表面上看,答案只是“它SerializableAttribute为类添加了元数据”,其目的SerializableAttribute是宣传(对诸如此类的东西BinaryFormatter)一个类型可以被序列化。BinaryFormatter将拒绝序列化未明确宣传序列化的事物。这可能是BinaryFormatter用于实现远程处理并防止数据意外泄漏到远程处理边界的结果。

请注意,大多数序列化程序并不关心SerializableAttribute因此这只会影响BinaryFormatter. 例如XmlSerializer, JSON.NETDataContractSerializerJavaScriptSerializerprotobuf-net 都没有真正关心SerializableAttribute.

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

  • 大多数属性是技术上的.custom instance值(在 IL 术语中)
  • 然而,SerializableAttribute实际上映射到一个 CLI.class标志,serializable

这不会改变意思,但是:作为一个新奇的事实,SerializableAttribute实际上并没有作为属性实现。

于 2012-09-17T14:31:57.237 回答
12

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

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

于 2012-09-17T14:25:06.440 回答
4

这只是长期的[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方法。

于 2012-09-17T14:24:54.830 回答
-1

文档中

表示一个类可以序列化

有关示例,请参阅文档。

于 2012-09-17T14:24:10.060 回答