2012-09-17 47 views
15

我期待在偷别人的C#代码和公共枚举之前有下面几行:什么[System.SerializableAttribute()做

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 

有人可以用简单的英语解释这些线是什么是做。

+0

这表明一个类可以被序列化:http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx – Steven

+0

是的,已经遇到了那个页面 - 它对我没有多大意义 - 我是新来的C# – Graham

+2

这不是别人的elses代码,这是生成的代码,由xsd.exe生成。 – Steven

回答

9

的System.SerializableAttribute指定给运行时那类的实例可以被序列化

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

+0

干杯 - 基本上,我可以忽略它,因为它不影响我如何使用它。 – Graham

+5

WCF通常使用'DataContractSerializer'; 'DataContractSerializer'实际上不需要'[Serializable]' - 它更喜欢'[DataContract]' –

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'}" 

而鉴于过程的性质双向的,如果我们收到这种格式的信息(例如从某个Web服务返回),那么我们可以愉快地将它序列化回这个类的一个实例。

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

+1

您的JSON或XML示例通常使用JavaScriptSerializer,DataContractSerializer,XmlSerializer或JSON.NET;其中没有一个关心'[Serializable]'。 –

+0

诚然,如果我们确实可以保证它只会以这种方式连续化。 –

52

这实际上是相当微妙...

表面上,简单的答案是“它增加了SerialiableAttribute为类的元数据”,其中的SerializableAttribute目的是为了做广告(的事情如BinaryFormatter)可以序列化一个类型。 BinaryFormatter将拒绝序列化未明确公布的用于序列化的事物。这可能是因为BinaryFormatter被用于执行远程处理,并防止数据意外泄漏到远程边界。

注意,大多数串行不护理SerializableAttribute,所以这影响之类的东西BinaryFormatter。例如,XmlSerializer,DataContractSerializer,JavaScriptSerializer,JSON.NET或protobuf-net都不在乎SerializableAttribute

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

  • 大多数属性在技术上.custom instance值(IL条款)
  • 然而, ,SerialiableAttribute实际上映射到CLI .class标志,serializable

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

+0

有趣!感谢那个Mark。 –

+1

马克你能详细解释IL部分吗?更改意味着什么,为什么这个属性的处理方式不同?谢谢 – gdoron