转载:http://book.51cto.com/art/200910/159211.htm
服务仍然能够使用只标记了Serializable特性的类型:
在导入如上类型的元数据时,导入的定义会使用DataContract特性。此外,既然Serializable特性只能影响字段,因而每一个可序列化的成员(无论公有还是私有)都是数据成员。所以,在导入定义中包装了的属性名就会沿袭原来的字段名:
客户端同样可以在它的数据契约中使用Serializable特性,从而具有传输型表示形式(Wire Representation)。也即是说,它是可编组的,这与前面的描述相同。
传统的格式器不能序列化只标记了DataContract特性的类型。要序列化这样的类型,必须同时应用DataContract特性和Serializable特性。对于该类型生成的数据契约,效果与只应用了DataContract特性相同,同时,我们仍然需要为需要序列化的成员添加DataMember特性。
数据契约与XML序列化
.NET还提供了另外一种序列化机制:XML序列化,它使用了一系列专门的特性。如果我们正在处理的数据类型需要显式地控制XML序列化,那么就应该将XmlSerializer-FormateAttribute特性应用到契约定义中单独的操作上,以指导WCF在运行时使用XML序列化。如果契约的所有操作都需要采用这种序列化形式,我们就可以使用SvcUtil(如第1章所述)的/serializer:XmlSerializer开关,指导它自动地将Xml-SerializerFormat特性应用到所有导入的契约中的所有操作上。使用这一开关时需要谨慎,因为它会影响所有的数据契约,包括那些不需要显式控制XML序列化的数据契约。
注意之处:
官网:
可将 DataMemberAttribute 应用于私有字段或属性。 请注意,将为 (即使它是私有的) 成员返回的数据序列化和反序列化,并因此用户可以查看或截获恶意用户或进程。
已应用 DataMemberAttribute 属性 (Attribute) 的属性 (Property) 必须同时具有 get
字段和 set
字段,不能只是 get
字段,也不能只有 set
字段。
如果你使用DataContractSerializer来序列化就不会出错,它默认对所有public属性进行序列化,如果标记了Serializable则是对所有字段而无视属性序列化,用了DataContractAttribute可以指定部分序列化。
在其继承行为方面,数据协定明显不同于实际接口。 接口由任何派生类型继承。 在将 DataContractAttribute应用于基类时,派生类型不会继承属性或行为。 但是,如果派生类型具有数据协定,则基类的数据成员将被序列化。 不过,若要使派生类中的新成员可序列化,必须向这些成员应用 DataMemberAttribute。