wcf是基于消息进行通信的,这篇就是简单说下序列化引擎是如何将.net object转化为
序列化的方式有三种:DataContractSerializer、NetDataContractSerializer和
DataContractSerializer是默认序列化方式,要使用DataContractSerializer类,先要实例化一个该类
DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
Person是一个数据协定类。在我们定义数据协定的时候有个kownType,初始化DataContractSerializer类如下:
[DataContract]public class Person{ }[DataContract]public class Man : Person{ }[DataContract]public class Woman : Person{ }Type[] kownTypes = new Type[]{typeof(Man),typeof(Woman)};DataContractSerialzier dcs = new DataContractSerializer(typeof(Person),kownTypes);
至于默认根名称和命名空间就不多说了,说数据协定的时候就介绍过。最大对象配额(maxItemInObjectGraph),值为整数,指定序列化和反序列化的最大项数。如下对象数为3,即本身(Test)+Num+Str,当然,里面还可嵌套其他数据协定:
[DataContract]public class Test{ [DataMember] public int Num {get;set;} [DataMember] public string Str {get;set;}}
往返行程是指对象反序列化和重新序列化时产生的从
[DataContract]public class PurchaseOrder{ [DataMember] public Address billTo; [DataMember] public Address shipTo;}[DataContract]public class Address{ [DataMember] public string street;}Address adr = new Address();adr.street = "123 Main St.";PurchaseOrder po = new PurchaseOrder{billTo=adr, shipTo=adr};//perserveObjectReferences=true<PurchaseOrder ser:id="1"> <billTo ser:id="2"><street ser:id="3">123 Main st.</treet></billTo> <shipTo ser:ref="2" /></PurchaseOrder>//perserveObjectReferences=false<PurchaseOrder> <billTo><street>123 Main st.</treet></billTo> <shipTo><street>123 Main st.</treet></shipTo></PurchaseOrder>
如上,preserveObjectReferences=true时,如果一个对象被多次引用,不会被再在
上面简单介绍了DataContractSerializer的构造,接下来说说序列化。
简单序列化:即使用基本的方法WriteObject,该方法使用指定的 System.IO.Stream 将对象的完整内容(开始、内容和结束)写入
分布引导序列化:即使用WriteStartObject、WriteObjectContent和WriteEndObject分别写入结束元素,对象内容和关闭包装元素。该序列化方式有两种常见用法:一是在WriteStartObject和WriteObjectContent之间插入内容;二是完全避免使用WriteStartObject和WriteEndObject,并写入自定义的包装元素或者跳过写入包装。
反序列化最基本的方法就是调用ReadObject方法。
接下来说下
[ServiceContract][public interface Testvoid SaveInfo(Person p); ......}public class Person{ [public string Name{get;set;} [public int Age{get;set;}}
DataContractSerializer序列化被DataContract和DataMember所标记的成员,而
好了,终于迈过这个坎了!尼玛的。。。。。。
原标题:WCF基础之序列化
关键词:wcf