... ...续Part I
XMLSerializer

提到XMLSerializer,我想绝大多数人都知道这是asmx采用的Serializer。首先我们还是来看一个例子,通过比较Managed Type的结构和生成的XML的结构来总结这种序列化方式采用的是怎样的一种Mapping方式。和DataContractSerialzer Sample一样,我们要定义用于序列化对象所属的Type——XMLOrder和XMLProduct,他们和相面对应的DataContractOrder和DataContractProduct具有相同的成员。

我的WCF之旅(4):WCF中的序列化[下篇]using System;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Collections.Generic;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Text;
我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]
namespace Artech.WCFSerialization
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]    
public class XMLProduct
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]    
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Private Fields#region Private Fields
我的WCF之旅(4):WCF中的序列化[下篇]        
private Guid _productID;
我的WCF之旅(4):WCF中的序列化[下篇]        
private string _productName;
我的WCF之旅(4):WCF中的序列化[下篇]        
private string _producingArea;
我的WCF之旅(4):WCF中的序列化[下篇]        
private double _unitPrice;
我的WCF之旅(4):WCF中的序列化[下篇]       
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Constructors#region Constructors
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLProduct()
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            Console.WriteLine(
"The constructor of XMLProduct has been invocated!");
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLProduct(Guid id, string name, string producingArea, double price)
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            
this._productID = id;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._productName = name;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._producingArea = producingArea;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._unitPrice = price;
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
#endregion

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Properties#region Properties
我的WCF之旅(4):WCF中的序列化[下篇]        
public Guid ProductID
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _productID; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _productID = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public string ProductName
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _productName; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _productName = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
internal string ProducingArea
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _producingArea; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _producingArea = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public double UnitPrice
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _unitPrice; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _unitPrice = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]       
#endregion

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]    }

我的WCF之旅(4):WCF中的序列化[下篇]}

我的WCF之旅(4):WCF中的序列化[下篇]


我的WCF之旅(4):WCF中的序列化[下篇]using System;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Collections.Generic;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Text;
我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]
namespace Artech.WCFSerialization
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]    
public class XMLOrder
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]    
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]        
private Guid _orderID;
我的WCF之旅(4):WCF中的序列化[下篇]        
private DateTime _orderDate;
我的WCF之旅(4):WCF中的序列化[下篇]        
private XMLProduct _product;
我的WCF之旅(4):WCF中的序列化[下篇]        
private int _quantity;
我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Constructors#region Constructors
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLOrder()
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            
this._orderID = new Guid();
我的WCF之旅(4):WCF中的序列化[下篇]            
this._orderDate = DateTime.MinValue;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._quantity = int.MinValue;
我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]            Console.WriteLine(
"The constructor of XMLOrder has been invocated!");
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLOrder(Guid id, DateTime date, XMLProduct product, int quantity)
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            
this._orderID = id;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._orderDate = date;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._product = product;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._quantity = quantity;
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]        
#endregion

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Properties#region Properties
我的WCF之旅(4):WCF中的序列化[下篇]        
public Guid OrderID
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _orderID; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _orderID = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public DateTime OrderDate
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _orderDate; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _orderDate = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLProduct Product
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _product; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _product = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public int Quantity
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _quantity; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _quantity = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]        
#endregion

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public override string ToString()
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            
return string.Format("ID: {0}/nDate:{1}/nProduct:/n/tID:{2}/n/tName:{3}/n/tProducing Area:{4}/n/tPrice:{5}/nQuantity:{6}",
我的WCF之旅(4):WCF中的序列化[下篇]                
this._orderID,this._orderDate,this._product.ProductID,this._product.ProductName,this._product.ProducingArea,this._product.UnitPrice,this._quantity);
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]    }

我的WCF之旅(4):WCF中的序列化[下篇]}

我的WCF之旅(4):WCF中的序列化[下篇]

编写Serialization的Code.

 

我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]static void SerializeViaXMLSerializer()
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            XMLProduct product 
= new XMLProduct(Guid.NewGuid(), "Dell PC""Xiamen FuJian"4500);
我的WCF之旅(4):WCF中的序列化[下篇]            XMLOrder order 
= new XMLOrder(Guid.NewGuid(), DateTime.Today, product, 300);
我的WCF之旅(4):WCF中的序列化[下篇]            
string fileName = _basePath + "Order.XmlSerializer.xml";
我的WCF之旅(4):WCF中的序列化[下篇]            
using (FileStream fs = new FileStream(fileName, FileMode.Create))
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]                XmlSerializer serializer 
= new XmlSerializer(typeof(XMLOrder));
我的WCF之旅(4):WCF中的序列化[下篇]                
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs))
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]                
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]                    serializer.Serialize(writer, order);
我的WCF之旅(4):WCF中的序列化[下篇]                }

我的WCF之旅(4):WCF中的序列化[下篇]            }

我的WCF之旅(4):WCF中的序列化[下篇]            Process.Start(fileName);
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]

调用上面定义的方法,生成序列化的XML。

 

我的WCF之旅(4):WCF中的序列化[下篇]<?xml version="1.0" encoding="utf-8"?>
我的WCF之旅(4):WCF中的序列化[下篇]
<XMLOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
我的WCF之旅(4):WCF中的序列化[下篇]    
<OrderID>b695fd18-9cd7-4792-968a-0c0c3a3962c2</OrderID>
我的WCF之旅(4):WCF中的序列化[下篇]    
<OrderDate>2007-03-09T00:00:00+08:00</OrderDate>
我的WCF之旅(4):WCF中的序列化[下篇]    
<Product>
我的WCF之旅(4):WCF中的序列化[下篇]        
<ProductID>23a2fe03-d0a0-4ce5-b213-c7e5196af566</ProductID>
我的WCF之旅(4):WCF中的序列化[下篇]        
<ProductName>Dell PC</ProductName>
我的WCF之旅(4):WCF中的序列化[下篇]        
<UnitPrice>4500</UnitPrice>
我的WCF之旅(4):WCF中的序列化[下篇]    
</Product>
我的WCF之旅(4):WCF中的序列化[下篇]    
<Quantity>300</Quantity>
我的WCF之旅(4):WCF中的序列化[下篇]
</XMLOrder>
我的WCF之旅(4):WCF中的序列化[下篇]

这里我们总结出以下的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。

我的WCF之旅(4):WCF中的序列化[下篇]using System;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Collections.Generic;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Text;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Xml.Serialization;
我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]
namespace Artech.WCFSerialization
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]    
public class XMLProduct
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]    
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Private Fields#region Private Fields
我的WCF之旅(4):WCF中的序列化[下篇]        
private Guid _productID;
我的WCF之旅(4):WCF中的序列化[下篇]        
private string _productName;
我的WCF之旅(4):WCF中的序列化[下篇]        
private string _producingArea;
我的WCF之旅(4):WCF中的序列化[下篇]        
private double _unitPrice;
我的WCF之旅(4):WCF中的序列化[下篇]        
#endregion

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Constructors#region Constructors
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLProduct()
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            Console.WriteLine(
"The constructor of XMLProduct has been invocated!");
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLProduct(Guid id, string name, string producingArea, double price)
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            
this._productID = id;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._productName = name;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._producingArea = producingArea;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._unitPrice = price;
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
#endregion

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Properties#region Properties
我的WCF之旅(4):WCF中的序列化[下篇]        [XmlAttribute(
"id")]
我的WCF之旅(4):WCF中的序列化[下篇]        
public Guid ProductID
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _productID; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _productID = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        [XmlElement(
"name")]
我的WCF之旅(4):WCF中的序列化[下篇]        
public string ProductName
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _productName; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _productName = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]        [XmlElement(
"producingArea")]
我的WCF之旅(4):WCF中的序列化[下篇]        
public string ProducingArea
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _producingArea; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _producingArea = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        [XmlElement(
"price")]
我的WCF之旅(4):WCF中的序列化[下篇]        
public double UnitPrice
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _unitPrice; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _unitPrice = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]
#endregion

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]    }

我的WCF之旅(4):WCF中的序列化[下篇]}

我的WCF之旅(4):WCF中的序列化[下篇]

 

我的WCF之旅(4):WCF中的序列化[下篇]using System;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Collections.Generic;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Text;
我的WCF之旅(4):WCF中的序列化[下篇]
using System.Xml.Serialization;
我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]
namespace Artech.WCFSerialization
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]    [XmlRoot(Namespace 
= "http://artech.wcfSerialization/Samples/Order")]
我的WCF之旅(4):WCF中的序列化[下篇]    
public class XMLOrder
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]    
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]        
private Guid _orderID;
我的WCF之旅(4):WCF中的序列化[下篇]        
private DateTime _orderDate;
我的WCF之旅(4):WCF中的序列化[下篇]        
private XMLProduct _product;
我的WCF之旅(4):WCF中的序列化[下篇]        
private int _quantity;
我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Constructors#region Constructors
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLOrder()
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            
this._orderID = new Guid();
我的WCF之旅(4):WCF中的序列化[下篇]            
this._orderDate = DateTime.MinValue;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._quantity = int.MinValue;
我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]            Console.WriteLine(
"The constructor of XMLOrder has been invocated!");
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLOrder(Guid id, DateTime date, XMLProduct product, int quantity)
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            
this._orderID = id;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._orderDate = date;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._product = product;
我的WCF之旅(4):WCF中的序列化[下篇]            
this._quantity = quantity;
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]        
#endregion

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
Properties#region Properties
我的WCF之旅(4):WCF中的序列化[下篇]        [XmlAttribute(
"id")]
我的WCF之旅(4):WCF中的序列化[下篇]        
public Guid OrderID
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _orderID; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _orderID = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]        [XmlElement(ElementName 
= "date",Order = 3)]
我的WCF之旅(4):WCF中的序列化[下篇]        
public DateTime OrderDate
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _orderDate; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _orderDate = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]        [XmlElement(ElementName 
= "product", Order = 1, Namespace = "Http://Artech.WCFSerialization/Samples/Product")]
我的WCF之旅(4):WCF中的序列化[下篇]        
public XMLProduct Product
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _product; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _product = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        [XmlElement(ElementName 
= "quantity", Order = 2)]
我的WCF之旅(4):WCF中的序列化[下篇]        
public int Quantity
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
get 我的WCF之旅(4):WCF中的序列化[下篇]return _quantity; }
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
set 我的WCF之旅(4):WCF中的序列化[下篇]{ _quantity = value; }
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]        
#endregion

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]        
public override string ToString()
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]            
return string.Format("ID: {0}/nDate:{1}/nProduct:/n/tID:{2}/n/tName:{3}/n/tProducing Area:{4}/n/tPrice:{5}/nQuantity:{6}",
我的WCF之旅(4):WCF中的序列化[下篇]                
this._orderID,this._orderDate,this._product.ProductID,this._product.ProductName,this._product.ProducingArea,this._product.UnitPrice,this._quantity);
我的WCF之旅(4):WCF中的序列化[下篇]        }

我的WCF之旅(4):WCF中的序列化[下篇]    }

我的WCF之旅(4):WCF中的序列化[下篇]}

我的WCF之旅(4):WCF中的序列化[下篇]

 

重新进行一次Serialization。我们可以得到下面的XML。

 

我的WCF之旅(4):WCF中的序列化[下篇]<?xml version="1.0" encoding="utf-8"?>
我的WCF之旅(4):WCF中的序列化[下篇]
<XMLOrder id="9a0bbda4-1743-4398-bc4f-ee216e02695b" xmlns="http://artech.wcfSerialization/Samples/Order" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
我的WCF之旅(4):WCF中的序列化[下篇]  
<product id="4e3aabe5-3a51-4000-9fd8-d821d164572a" xmlns="Http://Artech.WCFSerialization/Samples/Product">
我的WCF之旅(4):WCF中的序列化[下篇]    
<name>Dell PC</name>
我的WCF之旅(4):WCF中的序列化[下篇]    
<producingArea>Xiamen FuJian</producingArea>
我的WCF之旅(4):WCF中的序列化[下篇]    
<price>4500</price>
我的WCF之旅(4):WCF中的序列化[下篇]  
</product>
我的WCF之旅(4):WCF中的序列化[下篇]  
<quantity>300</quantity>
我的WCF之旅(4):WCF中的序列化[下篇]  
<date>2007-03-09T00:00:00+08:00</date>
我的WCF之旅(4):WCF中的序列化[下篇]
</XMLOrder>
我的WCF之旅(4):WCF中的序列化[下篇]

分析完XMLSerializer的Serialization功能,我们照例来分析它的反向过程—Deserialization。下面的Deserialization的Code。

 

我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]static void DeserializeViaXMLSerializer()
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]        
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]           
string fileName = _basePath + "Order.XmlSerializer.xml";
我的WCF之旅(4):WCF中的序列化[下篇]           XMLOrder order;
我的WCF之旅(4):WCF中的序列化[下篇]           
using (FileStream fs = new FileStream(fileName, FileMode.Open))
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]            
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]                XmlSerializer serializer 
= new XmlSerializer(typeof(XMLOrder), "http://artech.WCFSerialization/Samples");
我的WCF之旅(4):WCF中的序列化[下篇]                
using (XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()))
我的WCF之旅(4):WCF中的序列化[下篇]我的WCF之旅(4):WCF中的序列化[下篇]                
我的WCF之旅(4):WCF中的序列化[下篇]{
我的WCF之旅(4):WCF中的序列化[下篇]                    order
= serializer.Deserialize(reader) as XMLOrder;
我的WCF之旅(4):WCF中的序列化[下篇]                }

我的WCF之旅(4):WCF中的序列化[下篇]            }

我的WCF之旅(4):WCF中的序列化[下篇]
我的WCF之旅(4):WCF中的序列化[下篇]            Console.WriteLine(order);
我的WCF之旅(4):WCF中的序列化[下篇]            Console.Read();
我的WCF之旅(4):WCF中的序列化[下篇]}

我的WCF之旅(4):WCF中的序列化[下篇]

调用DeserializeViaXMLSerializer,得到下面的Screen Shot。下面显示的Order对象的信息和我们利用DataContractSerializaer进行Deserialization是的输出没有什么两样。不过有趣的是上面多出了两行额外的输出:The constructor of XMLProduct has been invocated! The constructor of XMLOrder has been invocated。而这个操作实际上是定义在XMLProduct和XMLOrder的默认(无参)构造函数里的。所此我们可以得出这样的结论——用XMLSerializer进程Deserialization,会调用的默认(无参)构造函数来初始化对象。 
我的WCF之旅(4):WCF中的序列化[下篇]

DataContractSerializer V.S. XMLSerializer

上面我们分别分析了两种不同的Serializer,现在我们来简单总结一下他们的区别:

特性

XMLSerializer

DataContractSerializer

默认Mapping

所有Public Field和可读可写Property

所有DataMember Filed、Property

是否需要Attribute

不需要

DataContract DataMember或者Serializable

成员的默认次序

Type中定义的顺序

字母排序

兼容性

.asmx

Remoting

Deserialzation

调用默认构造函数

不会调用


 

作者:Artech
出处:http://artech.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/cpcpc/archive/2010/12/30/2123098.html

相关文章: