默认用户自定义类型(类和结构)并不支持序列化,由于.NET没法判断对象状态是否须要反射到流。 用户自定义类的实例支持序列化 须要添加[Serialazable]。若要容许可序列化类型包含非序列化的成员变量可以使用[NonSerializad]vue
BinaryFormatter 序列化为二进制格式
SoapFormatter 使用.NET 特定的SOAP XMl格式
二者格式器都实现IFormatter接口vuex
两种格式器都要将类型的程序集及版本控制器信息持久化到流中,以保证序列化的对象可以被反序列化为正确的类型。 数组
使用[DataContract]进行标记类,使用[DataMember]标记成员
DataContractSerializer格式器继承XmlObjectSerializer。
在不曾标记DataContract特性,WCF就会自动推断,认为DataContract特性被应用到该类型上,且它的全部仅有成员(字段或属性)均被应用了DataMember特性。
组合数据契约:定义数据契约,对那些自己就是数据契约的成员也可使用DataMember特性。-数据契约具备递归性质
数据契约事件 serializing发生成在序列化以前,serialized事件发生在序列化后,desrializing发生在反序列化以前,desreialized发生在反序列化以后 markdown
每一个序列化事件处理方法都必须遵循以下的方法签名
void <Method Name>(StreamingContext context)
![]()
WCF在反序列化前必须建立一个对象,可是,WCF不会调用数据契约类的默认构造函数。 app
WCF要求类层级的每一级数据契约都必须标记DataContract特性,该特性不可继承。WCF能够在类层级混合使用Serializable和DataContract特性
WCF不能接收子类型数据,只能使用[KnownType(typeof(subclass))] 或[ServiceKnownType(typeof(SubClass))]函数
配置文件方法post
<add type="Contact,MyClassLibrary"> <knownType type="Customer,MyOtherClassLibrary"/> </add>
使用配置文件主要解决的问题是:当添加一个新的子类时必须修改代码、从新编译和从新部署。ui
在类型内部,默认的序列化顺序是按照字母的排序的,至于整个类层级的顺序,则是自上而下的。在序列化顺序不匹配的状况下,成员则以它们的值进行初始化。 自定义顺序可使用[DataMember]的Order属性值进行调整,该属性的默认值为-1,也就是它默认WCF顺序lua
成员的Order属性设置了相同的值,WCF会按照成员的字母顺序排序url
双向传递,即新的数据契约与旧版本的数据契约之间相互传递,它同时须要向后与向前的兼容性。
枚举类型老是支持序列化的。没必要应用DataContract特性,若是要将肯定的枚举值排除于数据契约以外,就须要在枚举类型标记DataContract特性,并在枚举值明确标记为[EnumMember]特性,没有标记EnumMember毛发的枚举值不属于该枚举的数据契约。同时可使用该特性的Value属性对枚举值设置别名。
不能定义包含了泛型类型参数的数据契约。即可以在数据契约中使用限定的泛型数据,只要在服务契约中指定了类型参数。
数据契约被重命名的格式为:<原有名>Of<类型参数><散列值>
同时也可使用[DataContract(Name=”ClassNameOf{0}{1}”)]表示。标识符中的数字就是类型参数的序数,能够用{#}表示为散列值
在使用集合接口IEnumberable,IList和ICollection,它他的传输型表示形式都使用了数组
若是契约中的集合为具体集合类型,并且属于可序列化集合(标记为Serializable特性而不是DataContract特性),那么,只要提供的集合包含Add()方法,WCF就可以自动地将集合规范为数组类型。
CollectionDataContract特性:该特性会检验Add()方法及检查IEumerable或IEnumerable接口是否存在。若是不存在,就会致使InvlidDataContractException异常。注:DataContract不能和CollectionDataContract一块儿使用