... ...续Part I([原创] 我的WCF之旅(4):WCF中的序列化(Serialization)- Part I)
XMLSerializer
提到XMLSerializer,我想绝大多数人都知道这是asmx采用的Serializer。首先我们还是来看一个例子,通过比较Managed Type的结构和生成的XML的结构来总结这种序列化方式采用的是怎样的一种Mapping方式。和DataContractSerialzer Sample一样,我们要定义用于序列化对象所属的Type——XMLOrder和XMLProduct,他们和相面对应的DataContractOrder和DataContractProduct具有相同的成员。
using
System;
using
System.Collections.Generic;
using
System.Text;

namespace
Artech.WCFSerialization

{
publicclassXMLProduct


{

PrivateFields#regionPrivateFields
privateGuid_productID;
privatestring_productName;
privatestring_producingArea;
privatedouble_unitPrice;


Constructors#regionConstructors
publicXMLProduct()


{
Console.WriteLine("TheconstructorofXMLProducthasbeeninvocated!");
}

publicXMLProduct(Guidid,stringname,stringproducingArea,doubleprice)


{
this._productID=id;
this._productName=name;
this._producingArea=producingArea;
this._unitPrice=price;
}

#endregion


Properties#regionProperties
publicGuidProductID


{

get
{return_productID;}

set
{_productID=value;}
}

publicstringProductName


{

get
{return_productName;}

set
{_productName=value;}
}

internalstringProducingArea


{

get
{return_producingArea;}

set
{_producingArea=value;}
}

publicdoubleUnitPrice


{

get
{return_unitPrice;}

set
{_unitPrice=value;}
}

#endregion

}
}
using
System;
using
System.Collections.Generic;
using
System.Text;

namespace
Artech.WCFSerialization

{
publicclassXMLOrder


{
privateGuid_orderID;
privateDateTime_orderDate;
privateXMLProduct_product;
privateint_quantity;


Constructors#regionConstructors
publicXMLOrder()


{
this._orderID=newGuid();
this._orderDate=DateTime.MinValue;
this._quantity=int.MinValue;

Console.WriteLine("TheconstructorofXMLOrderhasbeeninvocated!");
}

publicXMLOrder(Guidid,DateTimedate,XMLProductproduct,intquantity)


{
this._orderID=id;
this._orderDate=date;
this._product=product;
this._quantity=quantity;
}
#endregion


Properties#regionProperties
publicGuidOrderID


{

get
{return_orderID;}

set
{_orderID=value;}
}

publicDateTimeOrderDate


{

get
{return_orderDate;}

set
{_orderDate=value;}
}

publicXMLProductProduct


{

get
{return_product;}

set
{_product=value;}
}

publicintQuantity


{

get
{return_quantity;}

set
{_quantity=value;}
}
#endregion

publicoverridestringToString()


{
returnstring.Format("ID:{0}\nDate:{1}\nProduct:\n\tID:{2}\n\tName:{3}\n\tProducingArea:{4}\n\tPrice:{5}\nQuantity:{6}",
this._orderID,this._orderDate,this._product.ProductID,this._product.ProductName,this._product.ProducingArea,this._product.UnitPrice,this._quantity);
}
}
}
编写Serialization的Code.
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
staticvoidSerializeViaXMLSerializer()


{
XMLProductproduct=newXMLProduct(Guid.NewGuid(),"DellPC","XiamenFuJian",4500);
XMLOrderorder=newXMLOrder(Guid.NewGuid(),DateTime.Today,product,300);
stringfileName=_basePath+"Order.XmlSerializer.xml";
using(FileStreamfs=newFileStream(fileName,FileMode.Create))


{
XmlSerializerserializer=newXmlSerializer(typeof(XMLOrder));
using(XmlDictionaryWriterwriter=XmlDictionaryWriter.CreateTextWriter(fs))


{
serializer.Serialize(writer,order);
}
}
Process.Start(fileName);
}
调用上面定义的方法,生成序列化的XML。
<?
xmlversion="1.0"encoding="utf-8"
?>
<
XMLOrder
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
>
<
OrderID
>
b695fd18-9cd7-4792-968a-0c0c3a3962c2
</
OrderID
>
<
OrderDate
>
2007-03-09T00:00:00+08:00
</
OrderDate
>
<
Product
>
<
ProductID
>
23a2fe03-d0a0-4ce5-b213-c7e5196af566
</
ProductID
>
<
ProductName
>
DellPC
</
ProductName
>
<
UnitPrice
>
4500
</
UnitPrice
>
</
Product
>
<
Quantity
>
300
</
Quantity
>
</
XMLOrder
>
这里我们总结出以下的Mapping关系:
-
Root Element被指定为类名。
-
不会再Root Element中添加相应的Namaspace。
-
对象成员以XML Element的形式输出。
-
对象成员出现的顺利和在Type定义的顺序一致。
-
只有Public Field和可读可写得Proppery才会被序列化到XML中——比如定义在XMLProduct中的internal string ProducingArea没有出现在XML中。
-
Type定义的时候不需要运用任何Attribute。
以上这些都是默认的Mapping关系,同DataContractSerializer一样,我们可以通过在Type以及它的成员中运用一些Attribute来改这种默认的Mapping。
-
Root Element名称之后能为类名。
-
可以在Type上运用XMLRoot,通过Namaspace参数在Root Element指定Namespace。
-
可以通过在类成员上运用XMLElement Attribute和XMLAttribute Attribute指定对象成员转化成XMLElement还是XMLAttribute。并且可以通过NameSpace参数定义Namespace。
-
可以在XMLElement或者XMLAttribute Attribute 通过Order参数指定成员在XML出现的位置。
-
可以通过XmlIgnore attribute阻止对象成员被序列化。
基于上面这些,我们重新定义了XMLProduct和XMLOrder。
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Xml.Serialization;

namespace
Artech.WCFSerialization

{
publicclassXMLProduct


{

PrivateFields#regionPrivateFields
privateGuid_productID;
privatestring_productName;
privatestring_producingArea;
privatedouble_unitPrice;
#endregion


Constructors#regionConstructors
publicXMLProduct()


{
Console.WriteLine("TheconstructorofXMLProducthasbeeninvocated!");
}

publicXMLProduct(Guidid,stringname,stringproducingArea,doubleprice)


{