在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);
}}
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阻止对象成员被序列化
阅读(2559) | 评论(0) | 转发(0) |