前面我们已经讲到如何使用System.Xml.Serialization命名空间中的各种特性对要序列化的类进行标记,这里再说一说如何利用XmlSerializer进行对象的序列化。如果对对象序列化缺少了解,可以通过下面两个链接了解:
● 在.NET中实现对象序列化
● 对象序列化:使用System.Xml.Serialization命名空间
XmlSerializer的Serialize提供了6个重载方法,实际上属于3种类型。它允许将序列化的结果保存到TextWriter、Stream、XmlWriter对象中。
正如在对象序列化:使用System.Xml.Serialization命名空间中讲到的,使用XmlTextWriter的好处在于,可以在序列化的XML文件声明中显式的指定encoding,而如果使用的是TextWriter或Stream,那么将按.NET的默认的编码方式序列化(前文已经讲到,可以使用的是UTF8,不过这只是我的猜测)。
如果要把序列化后的XML文档保存为本地文件,那么使用XmlTextWriter是最好的一种选择。但是,如果要直接传输序列化后的XML文档,那么使用Stream最好。.NET提供了多种Stream的继承类用于在不同场合的Stream处理。要直接传输序列化后的XML文档,MemoryStream是不错的选择。
如果同时希望在序列化的XML文件声明中显式的指定encoding,那么还是可以使用XmlTextWriter的,MemoryStream也不可少。
这样,既可以直接使用MemoryStream的ToArray方法以Byte数组进行传输,也可以使用Encoding.UTF8. GetString(mem. ToArray)将Byte数组转换成String类型进行传输。
一切看起来都很顺利,但是我在使用XmlDocument验证序列化的XML文档时,碰到一个问题。还是使用前文的例子,当我使用下面的代码时,总是产生XmlException异常“根级别上的数据无效”:
使用Console.WriteLine打印出的结果是下面的样子,很完整的XML文档,只不过前面多了一个“?”:
本来以为这个?是包含在序列化的XML文档中的,但是使用String的StartWith方法却找不到这个?。看来它不属于XML文档的一部分。当使用Trim时,一切OK,?没有了,异常没有了:)
● 在.NET中实现对象序列化
● 对象序列化:使用System.Xml.Serialization命名空间
XmlSerializer的Serialize提供了6个重载方法,实际上属于3种类型。它允许将序列化的结果保存到TextWriter、Stream、XmlWriter对象中。
正如在对象序列化:使用System.Xml.Serialization命名空间中讲到的,使用XmlTextWriter的好处在于,可以在序列化的XML文件声明中显式的指定encoding,而如果使用的是TextWriter或Stream,那么将按.NET的默认的编码方式序列化(前文已经讲到,可以使用的是UTF8,不过这只是我的猜测)。
如果要把序列化后的XML文档保存为本地文件,那么使用XmlTextWriter是最好的一种选择。但是,如果要直接传输序列化后的XML文档,那么使用Stream最好。.NET提供了多种Stream的继承类用于在不同场合的Stream处理。要直接传输序列化后的XML文档,MemoryStream是不错的选择。
Dim
mem
As
New
System.IO.MemoryStream
Dim serializer As New XmlSerializer( GetType (Order))
serializer.Serialize(mem, o, ns)
Dim serializer As New XmlSerializer( GetType (Order))
serializer.Serialize(mem, o, ns)
如果同时希望在序列化的XML文件声明中显式的指定encoding,那么还是可以使用XmlTextWriter的,MemoryStream也不可少。
Dim
mem
As
New
System.IO.MemoryStream
Dim writer As New XmlTextWriter(mem, Encoding.UTF8)
Dim serializer As New XmlSerializer( GetType (Order))
serializer.Serialize(writer, o, ns)
Dim writer As New XmlTextWriter(mem, Encoding.UTF8)
Dim serializer As New XmlSerializer( GetType (Order))
serializer.Serialize(writer, o, ns)
这样,既可以直接使用MemoryStream的ToArray方法以Byte数组进行传输,也可以使用Encoding.UTF8. GetString(mem. ToArray)将Byte数组转换成String类型进行传输。
一切看起来都很顺利,但是我在使用XmlDocument验证序列化的XML文档时,碰到一个问题。还是使用前文的例子,当我使用下面的代码时,总是产生XmlException异常“根级别上的数据无效”:
Dim
doc
As
New
XmlDocument
doc.LoadXml(Encoding.UTF8.GetString(mem.ToArray))
doc.LoadXml(Encoding.UTF8.GetString(mem.ToArray))
使用Console.WriteLine打印出的结果是下面的样子,很完整的XML文档,只不过前面多了一个“?”:
?
<?
xml version="1.0" encoding="utf-8"
?>
< order id =”123456”>
<orderDate > 2005-04-05 </ orderDate >
< items >
< item >
< name > 对象序列化 </ name >
</ item >
</ items >
</ order >
< order id =”123456”>
<orderDate > 2005-04-05 </ orderDate >
< items >
< item >
< name > 对象序列化 </ name >
</ item >
</ items >
</ order >
本来以为这个?是包含在序列化的XML文档中的,但是使用String的StartWith方法却找不到这个?。看来它不属于XML文档的一部分。当使用Trim时,一切OK,?没有了,异常没有了:)
Dim
doc
As
New
XmlDocument
doc.LoadXml(Encoding.UTF8.GetString(mem.ToArray). Trim ())
doc.LoadXml(Encoding.UTF8.GetString(mem.ToArray). Trim ())