1序列化,对于WCF来说,为了区别于.NET(SOAP/Binary Formatter)和不同平台通用,用的是XML方式。
序列化是对整个Class成员进行的,而Data Contract可以显式的定义需要Contract的成员(不是全部,[DataContract],[DataMember])。
2.客户端进行Import Data Contract之后,自动对[DataMember]产生Private Field和Public Property,所以要避免对一个私有成员和他对应的Property重复定义[DataMember];同时可以根据需要定义事件(序列化之前以及之后Void OnSerialized/OnSerializing),比如对某些数据成员的初始化操作。
3.Data Contract可以继承,但是不可以把子类对象赋给基类(参数,返回值)。WCF面向对象支持的不够好,不过可以通过Service Known Type解决。
4.两个Data Contract可以通过定义相同的[DataContract(Name="XXX")],来互相替换,对于客户端只阐释一个Data Contract.
5.Data 版本的控制(松散耦合);比如某一端新增的Data Member,另外一端将忽略。
对于减少Data Member,另外一端将赋值null;
但是这样的后果,将会产生Versioning RoundTrip(在互相传递Data Member时Serialize/Deserialize时会丢掉),不过Client自动产生的Proxy已经实现了IExtensibleDataObject,解决了这个问题。保证Server/Client互相不会影响。
6.枚举,DataSet/DataTable,Collection支持序列化,可以作为Data Type应用到Data Member。
不建议Delegate(指针)作为Data Member。