WCF之序列化

WCF客户端与服务端是通过消息进行互通的。在客户端WCF把传入参数序列化后,把它们绑定到客户端的输出消息中传递给服务端,服务端接收消息后反序列化并转换为CLR类型,进行一些逻辑处理后把输出参数以及返回值序列化并绑定到返回消息中,客户端接收到返回值消息后,反序列化并转换成相应的本地类型,完成一次通讯。序列化在WCF中,套用刘大脑袋的一句话就是“必须的”。

WCF中可以选择的序列化机制有DataContractSerializer、NetDataContractSerializer、XmlSerializer和DataContractJsonSerializer。

下面就写一段简单的代码来看看这几种序列化方式,把数据给序列化后的模样。

 
  
using System;
using System.Runtime.Serialization;
using System.Xml.Schema;
using System.IO;
using System.Xml.Serialization;
using System.Runtime.Serialization.Json;

namespace WcfSerializer
{
public class Fruit
{
private string m_Name = string .Empty;
private string m_Price = string .Empty;
// 如果没有无参数的构造方法,DataContractSerializer和XmlSerializer将有异常抛出
// 去掉无参数的构造方法DataContractSerializer可以用[DataContract]修饰类,   [DataMember]修饰字段或者属性,避免异常
public Fruit()
{
}
public Fruit( string name, string price)
{
m_Name
= name;
m_Price
= price;
}
public string Name
{
get
{
return m_Name;
}
set
{
m_Name
= value;
}
}
public string Price
{
get
{
return m_Price;
}
set
{
m_Price
= value;
}
}
}
class Program
{
static void Main( string [] args)
{
// 导出类型的xsd
XsdDataContractExporter xsdExporter = new XsdDataContractExporter();
xsdExporter.Options
= new ExportOptions();
xsdExporter.Export(
typeof (Fruit));
using (FileStream fs = new FileStream( " Fruit.xsd " , FileMode.Create))
{
foreach (XmlSchema schema in xsdExporter.Schemas.Schemas())
schema.Write(fs);
}

Fruit fruit
= new Fruit( " banana " , " 6.00 " );

// DataContractSerializer序列化,WCF默认的序列化方式
using (FileStream fs = new FileStream( " FruitDataContractSerializer.xml " , FileMode.Create))
{
DataContractSerializer dataSer
= new DataContractSerializer( typeof (Fruit));
dataSer.WriteObject(fs, fruit);
}

// NetDataContractSerializer 序列化,NetDataContractSerializer不需要传入类型 参数,在运行时才决定类的CLR类型
using (FileStream fs = new FileStream( " FruitNetDataContractSerializer.xml " , FileMode.Create))
{
NetDataContractSerializer netDataSer
= new NetDataContractSerializer();
netDataSer.WriteObject(fs, fruit);
}

// XmlSerializer序列化,要求被序列化的类型必须有公共的构造方法
using (FileStream fs = new FileStream( " FruitXmlSerializer.xml " , FileMode.Create))
{
XmlSerializer xmlSer
= new XmlSerializer( typeof (Fruit));
xmlSer.Serialize(fs, fruit);
}

// DataContractJsonSerializer序列化,序列为josn格式数据,方便ajax使用
using (FileStream fs = new FileStream( " FruitDataContractJsonSerializer.xml " , FileMode.Create))
{
DataContractJsonSerializer josnSer
= new DataContractJsonSerializer( typeof (Fruit));
josnSer.WriteObject(fs, fruit);
}
}
}
}

类型的xsd如下:

 2011042211021440.jpg

DataContractSerializer序列化的数据:

 2011042211024811.jpg

NetDataContractSerializer序列化的数据:

 2011042211030825.jpg

XmlSerializer序列化的数据:

 2011042211032593.jpg

DataContractJsonSerializer序列化的数据:

 2011042211035038.jpg

转载于:https://www.cnblogs.com/qiuwuyu/archive/2011/04/11/2012029.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值