... ...续Part I([原创] 我的WCF之旅(4):WCF中的序列化(Serialization)- Part I)
XMLSerializer
提到XMLSerializer,我想绝大多数
人都知道这是asmx采用的Serializer。首先我们还是来看一个例子,通过比较Managed
Type的结构和生成的XML的结构来总结这种序列化方式采用的是怎样的一种Mapping方式。和DataContractSerialzer
Sample一样,我们要定义用于序列化对象所属的Type——XMLOrder和XMLProduct,他们和相面对应的
DataContractOrder和DataContractProduct具有相同的成员。
编写Serialization的Code.
调用上面定义的方法,生成序列化的XML。
这里我们总结出以下的Mapping关系:
-
Root Element被指定为类名。
-
不会再Root Element中添加相应的Namaspace。
-
对象成员以XML Element的形式输出。
-
对象成员出现的顺利和在Type定义的顺序一致。
-
只有Public Field和可读可写得Proppery才会被序列化到XML中——比如定义在XMLProduct中的internal string ProducingArea没有出现在XML中。
-
Type定义的时候不需要运用任何Attribute。
以上这些都是默认的Mapping关系,同DataContractSerializer一样,我们可以通过在Type以及它的成员中运用一些Attribute来改这种默认的Mapping。
-
Root Element名称之后能为类名。
-
可以在Type上运用XMLRoot,通过Namaspace参数在Root Element指定Namespace。
-
可以通过在类成员上运用XMLElement Attribute和XMLAttribute Attribute指定对象成员转化成XMLElement还是XMLAttribute。并且可以通过NameSpace参数定义Namespace。
-
可以在XMLElement或者XMLAttribute Attribute 通过Order参数指定成员在XML出现的位置。
-
可以通过XmlIgnore attribute阻止对象成员被序列化。
基于上面这些,我们重新定义了XMLProduct和XMLOrder。
重新进行一次Serialization。我们可以得到下面的XML。
分析完XMLSerializer的Serialization功能,我们照例来分析它的反向过程—Deserialization。下面的Deserialization的Code。
调用
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 |
调用默认构造函数 |
不会调用 |