注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

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

2011-03-25 10:12:53|  分类: WCF |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace Artech.WCFSerialization
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客
{
    
public class XMLProduct
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客    
{
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
#region Private Fields
        
private Guid _productID;
        
private string _productName;
        
private string _producingArea;
        
private double _unitPrice;
        
#endregion


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


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


        
#endregion


我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
#region Properties
        [XmlAttribute(
"id")]
        
public Guid ProductID
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
{
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
get return _productID; }
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
set { _productID = value; }
        }


        [XmlElement(
"name")]
        
public string ProductName
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
{
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
get return _productName; }
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
set { _productName = value; }
        }

        [XmlElement(
"producingArea")]
        
public string ProducingArea
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
{
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
get return _producingArea; }
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
set { _producingArea = value; }
        }


        [XmlElement(
"price")]
        
public double UnitPrice
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
{
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
get return _unitPrice; }
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
set { _unitPrice = value; }
追求属于教育者的幸福 - weiqiang-sy - 荷塘-月色         }


#endregion


    }

}


using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace Artech.WCFSerialization
(原创)手记 - 暗香浮动 - 暗香浮动月黄昏
{
    [XmlRoot(Namespace 
= "http://artech.wcfSerialization/Samples/Order")]
    
public class XMLOrder
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客    
{
        
private Guid _orderID;
        
private DateTime _orderDate;
        
private XMLProduct _product;
        
private int _quantity;

我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
#region Constructors
        
public XMLOrder()
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
{
            
this._orderID = new Guid();
            
this._orderDate = DateTime.MinValue;
            
this._quantity = int.MinValue;

            Console.WriteLine(
"The constructor of XMLOrder has been invocated!");
        }


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

        
#endregion


我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
#region Properties
        [XmlAttribute(
"id")]
        
public Guid OrderID
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
{
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
get return _orderID; }
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客            
set { _orderID = value; }
        }

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

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


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

        
#endregion


        
public override string ToString()
我的WCF之旅(4):WCF中的序列化[下篇2] - 海里的贝壳 - apple的博客        
{
            
return string.Format("ID: {0}\nDate:{1}\nProduct:\n\tID:{2}\n\tName:{3}\n\tProducing Area:{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。我们可以得到下面的XML。

<?xml version="1.0" encoding="utf-8"?>
<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">
  
<product id="4e3aabe5-3a51-4000-9fd8-d821d164572a" xmlns="Http://Artech.WCFSerialization/Samples/Product">
    
<name>Dell PC</name>
    
<producingArea>Xiamen FuJian</producingArea>
    
<price>4500</price>
  
</product>
  
<quantity>300</quantity>
  
<date>2007-03-09T00:00:00+08:00</date>
</XMLOrder>

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

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

            }


            Console.WriteLine(order);
            Console.Read();
}

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

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 
  评论这张
 
阅读(594)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017