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);
}
}
}
}
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如下:
DataContractSerializer序列化的数据:
NetDataContractSerializer序列化的数据:
XmlSerializer序列化的数据:
DataContractJsonSerializer序列化的数据: