WCF 序列化 DataContractSerializer & XMLSerializer
时间:2010-06-11 来源:wuye_chinaunix
在WCF中,我们有3种不同的Serializer——
DataContractSerializer(定义在 System.RunTime.Serializtion namespace中)、
XMLSerializer(定义在System.XML.Serialization namespace) ----asmx采用的Serializer、
NetDataContractSerializer (定义在System.XML.Serialization namespace)
(在C#中有BinaryFormatter)
他们不同的方式实现.NET Object的Serialization。由于DataContractSerializer和NetDataContractSerializer基 本上没有太大的区别,我们只讨论DataContractSerializer和XMLSerializer。
其中 DataContractSerializer为WCF默认的Serializer,如果没有显式定采用另外一种Serializer,WCF会创建一个 DataContractSerializer 序列化NET Object。
DataContractSerializer采用怎样的一种Mapping方式来把.NET Object转化成XML:
相关的Type必须运用System.Runtime.Serialization. DataContractAttribute, 【DataContract】
需要序列化的成员必须运用System.Runtime.Serialization. DataMemberAttribute。[DataMember]
【DataContract】
class contract
{
[DataMember]
public int a;
...
}
using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(contract));
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs))
{
serializer.WriteObject(writer, contraceInstance);
}
}
XMLSerializer:
[Serializable] //must be
[XMLRoot(''')]
class xxxx
{
public int a;
[XmlElement("Number")] //change serialization element(node)'s default name
public string no;
[XmlIgnor]
pulic int iNotSerialize;
// default constructor
public xxx() //will be called when deserialization
{
}
}
DataContractSerializer(定义在 System.RunTime.Serializtion namespace中)、
XMLSerializer(定义在System.XML.Serialization namespace) ----asmx采用的Serializer、
NetDataContractSerializer (定义在System.XML.Serialization namespace)
(在C#中有BinaryFormatter)
他们不同的方式实现.NET Object的Serialization。由于DataContractSerializer和NetDataContractSerializer基 本上没有太大的区别,我们只讨论DataContractSerializer和XMLSerializer。
其中 DataContractSerializer为WCF默认的Serializer,如果没有显式定采用另外一种Serializer,WCF会创建一个 DataContractSerializer 序列化NET Object。
DataContractSerializer采用怎样的一种Mapping方式来把.NET Object转化成XML:
相关的Type必须运用System.Runtime.Serialization. DataContractAttribute, 【DataContract】
需要序列化的成员必须运用System.Runtime.Serialization. DataMemberAttribute。[DataMember]
【DataContract】
class contract
{
[DataMember]
public int a;
...
}
using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(contract));
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs))
{
serializer.WriteObject(writer, contraceInstance);
}
}
Mapping方式:
1. Root Element为对象的Type Name
2. Type的Namespace会被加到XML根节点的Namespace中
3. 对象的所有成员以XML Element的形式而不是以XML Attribute的形式输出。
4. 所以对象在XML的输出顺序是按照字母排序。
5. 所有成员的Elelement 名称为成员名称。
6. 不论成员设置怎样的作用域(public,protected,internal,甚至市Private),
所有运用了 DataMemberAttribute的成员均被序列化到XML中——private string ProducingArea。
7. Type和成员必须运用DataContractAttribute和DataMemberAttribute才能被序列化。
XMLSerializer:
[Serializable] //must be
[XMLRoot(''')]
class xxxx
{
public int a;
[XmlElement("Number")] //change serialization element(node)'s default name
public string no;
[XmlIgnor]
pulic int iNotSerialize;
// default constructor
public xxx() //will be called when deserialization
{
}
}
-
Root Element被指定为类名。不会再Root Element中添加相应的Namaspace。对象成员以XML Element的形式输出。对象成员出现的顺利和在Type定 义的顺序一致。只有Public Field和可读可写得Proppery才会被序列化到XML中——比如定义在XMLProduct中的internal string ProducingArea没有出现在XML中。Type定义的时候不需要运用任何 Attribute。
-
Root Element名称之后能为类名。可以在Type上运用 XMLRoot,通过Namaspace参数在Root Element指定Namespace。可以通过在类成员上运用 XMLElement Attribute和XMLAttribute Attribute指定对象成员转化成XMLElement还是XMLAttribute。并且可以通过NameSpace参数定义Namespace。可以在XMLElement或者 XMLAttribute Attribute 通过Order参数指定成员在XML出现的位置。可以通过XmlIgnore attribute阻止对象成员被序列化
相关阅读 更多 +