数据契约的定义与数据契约序列化器(2.1)
时间:2011-12-27 23:31来源: 作者:admin 点击: 次
基于DataContractSerializer的序列化规则
与在5.1节介绍XmlSerializer的序列化规则一样,现在我们通过一个具体的例子来介绍DataContractSerializer是如何进行序列化的,以及采用怎样的序列化规则。照例定义一个泛型的辅助方法进行专门的序列化工作,最终生成的XML保存到一个XML文件中。
-
public
static <T>(Tvoid Serialize instance, string fileName) -
{
-
serializerDataContractSerializer = new
DataContractSerializer(typeof(T)); -
writerusing (XmlWriter = new
XmlTextWriter(fileName,Encoding.UTF8)) -
{ -
serializer.WriteObject(writer, instance); -
} -
Process.Start(fileName); -
}
我们需要对一个Order对象进行序列化,Order类型的定义如下。实际上定义了两个数据契约:OrderBase和Order,Order继承于OrderBase。
-
namespace
Artech.DataContractSerializerDe mos -
{
-
[DataContract] -
public class OrderBase -
{ -
[DataMember] -
public Guid ID -
{ get; set; } -
-
[DataMember] -
public DateTime Date -
{ get; set; } -
-
[DataMember] -
public string Customer -
{ get; set; } -
-
[DataMember] -
public string ShipAddress -
{ get; set; } -
-
public double TotalPrice -
{ get; set; } -
} -
-
[DataContract] -
public class Order : OrderBase -
{ -
[DataMember] -
public string PaymentType -
{ get; set; } -
} -
}
通过下面的代码对创建的Order对象进行序列化,会生成一段XML。
-
Order
order = newOrder() -
{
-
ID= Guid.NewGuid(), -
Date= DateTime.Today, -
Customer= "NCS", -
ShipAddress= "#328,Airport ,Rd, Industrial
Park,Suzhou JiangSu Province" -
TotalPrice= 8888, -
PaymentType= "CreditCard" -
};
-
Serialize(order,
@"E:\order.xml"); -
<Order
xmlns:i="http://www.w3.org/2001/XMLSchema-
instance"xmlns="http:// -
>schemas.datacontract.org/2004/07/Artech.
DataContractSerializerDemos" -
<Customer>NCS</Customer> -
<Date>2008-12-03T00:00:00+08:00</Date> -
<ID>5fdbee36-e29e-48d2-b45f-6fd4beba54d6</ID> -
<ShipAddress>#328,Airport Rd, Industrial Park,
SuzhouJiangSu -
</ShipAddress>Province -
<PaymentType>CreditCard </PaymentType> -
</Order>
将数据契约与最终生成的XML结构进行对比,我们可以看出DataContractSerializer在默认的情况下采用了如下的序列化规则。
XML的根节点名称为数据契约类型的名称,默认的命名空间采用这样的格式:{数据契约类型的命名空间};
只有显式应用了DataMemberAttribute特性的字段或属性才能作为数据成员采用,才会参与序列化(比如TotalPrice属性的值不会出现在序列化后的XML中);
所有数据成员均以XML元素的形式被序列化;
序列化后数据成员在XML的次序采用这样的规则:父类数据成员在前,子类数据成员在后;定义在同一个类型的数据成员按照字母排序。
