[原创]我的WCF之旅(4):WCF中的序列化(Serialization)- Part II

... ...续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关系:

  1. Root Element被指定为类名。
  2. 不会再Root Element中添加相应的Namaspace。
  3. 对象成员以XML Element的形式输出。
  4. 对象成员出现的顺利和在Type定义的顺序一致。
  5. 只有Public Field和可读可写得Proppery才会被序列化到XML中——比如定义在XMLProduct中的internal string ProducingArea没有出现在XML中。
  6. Type定义的时候不需要运用任何Attribute。

以上这些都是默认的Mapping关系,同DataContractSerializer一样,我们可以通过在Type以及它的成员中运用一些Attribute来改这种默认的Mapping。

  1. Root Element名称之后能为类名。
  2. 可以在Type上运用XMLRoot,通过Namaspace参数在Root Element指定Namespace。
  3. 可以通过在类成员上运用XMLElement Attribute和XMLAttribute Attribute指定对象成员转化成XMLElement还是XMLAttribute。并且可以通过NameSpace参数定义Namespace。
  4. 可以在XMLElement或者XMLAttribute Attribute 通过Order参数指定成员在XML出现的位置。
  5. 可以通过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)
{
分享到:
评论

你可能感兴趣的:(xml,WCF)