数据契约DataContract与Serializable特性

转载: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序列化的数据契约。

 

注意之处:

官网:

https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.serialization.datacontractattribute?view=netframework-4.8#%E5%8F%A6%E8%AF%B7%E5%8F%82%E9%98%85

https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.serialization.datamemberattribute?view=netframework-4.8

可将 DataMemberAttribute 应用于私有字段或属性。 请注意,将为 (即使它是私有的) 成员返回的数据序列化和反序列化,并因此用户可以查看或截获恶意用户或进程。

已应用 DataMemberAttribute 属性 (Attribute) 的属性 (Property) 必须同时具有 get 字段和 set 字段,不能只是 get 字段,也不能只有 set 字段。

如果你使用DataContractSerializer来序列化就不会出错,它默认对所有public属性进行序列化,如果标记了Serializable则是对所有字段而无视属性序列化,用了DataContractAttribute可以指定部分序列化。

在其继承行为方面,数据协定明显不同于实际接口。 接口由任何派生类型继承。 在将 DataContractAttribute应用于基类时,派生类型不会继承属性或行为。 但是,如果派生类型具有数据协定,则基类的数据成员将被序列化。 不过,若要使派生类中的新成员可序列化,必须向这些成员应用 DataMemberAttribute

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值