对象序列化:使用System.Xml.Serialization命名空间(转)
2008-03-04 16:42
134 查看
要使用.NET进行对象的序列化,必须在解决方案中添加System.Xml的引用,并且在类文件中引入System.Xml.Serialization命名空间。这样就可以在文件中使用序列化所需要的各种特性了。
Imports System.Xml.Serialization
如果对XML Serialization缺少了解,请首先参考拙文:在.NET中实现对象序列化
<?xml version="1.0" encoding="utf-8"?>
<order id=”123456”>
<orderDate>2005-04-05</orderDate>
<items>
<item>
<name>对象序列化</name>
</item>
</items>
</order>
上面的例子包含了典型的XML中常见的各种元素:XML声明、XML根节点、XML节点、XML属性、XML集合。除XML声明外,在.NET中都有对应的特性用于定义这些元素。这些特性包括:XmlRootAttribute、XmlTypeAttribute、XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute和XmlArrayItemAttribute。另外,还有两个常用的特性,XmlIgnoreAttribute用于标记在对象序列化时需要被忽略的部分,XmlIncludeAttribute用于标记在生成XML Schema时需要包括的类型。
如果没有显式地标记任何特性,那么默认类的特性为XmlTypeAttribute、类成员的特性为XmlElementAttribute,且名称为类或类成员的名称。例如:
Public Class OrderClass Order
Public ID As String
Public OrderDate As String
End Class
如果不做任何特性标记,使用下面的代码序列化时:
Dim o As New Order
With o
.ID = 123456
.OrderDate = Date.Now.ToShortDateString
End With
Dim writer As New XmlTextWriter("abc.xml", Encoding.UTF8)
Dim serializer As New XmlSerializer(GetType(Order))
writer.Formatting = Formatting.Indented
serializer.Serialize(writer, o)
序列化后的XML为:
<?xml version="1.0" encoding="utf-8"?>
<Order xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ID>123456</ID>
<OrderDate>2005-4-11</OrderDate>
</Order>
可以看到,<Order>对应Order类,而<ID>和<OrderDate>分别对应Order类中的字段ID和OrderDate。另外,多了一个XML声明和两个XML命名空间。
XML声明是.NET自动添加的,但是encoding是在XmlTextWriter中指定的,如果不指定encoding,那么XML声明只有<?xml version="1.0"?>。我使用的是.NET 1.1,这个版本中只支持XML 1.0版本。另外,如果不指定encoding,那么默认的编码可能也是UTF8(没找到相关的资料)。
.NET默认为Order类添加了XMLSchema和XMLSchema-instance两个W3C的命名空间。该命名空间也可以自己指定,方法是使用XmlSerializer的另一个Serialize方法。
Dim ns As New XmlSerializerNamespaces
ns.Add("", "")
writer.Formatting = Formatting.Indented
serializer.Serialize(writer, o, ns)
要将类序列化为XML节点:
<XmlType("order")> _
Public Class OrderClass Order
‘ any code here.
End Class
要将类序列化为XML根节点:
<XmlRoot("order")> _
Public Class OrderClass Order
‘ any code here.
End Class
当在类中同时使用XmlRootAttribute、XmlTypeAttribute时,序列化文档中的类型以XmlRootAttribute为准:
<XmlRoot("order"), XmlType("anotherOrderName")> _
Public Class OrderClass Order
‘ any code here.
End Class
要将类成员序列化为XML节点:
<XmlAttributeAttribute("id")> _
Public ID As String
要将类成员序列化为XML属性:
<XmlAttributeAttribute("id")> _
Public ID As String
要将类成员序列化为XML集合:
<XmlRoot("order"), XmlType("anotherOrderName")> _
Public Class OrderClass Order
<XmlAttributeAttribute("id")> _
Public ID As String
Public orderDate As String
<XmlArray("items"), XmlArrayItem("item", Type:=GetType(OrderItem))> _
Public Items As New ArrayList
End Class
<XmlType("orderItem")> _
Public Class OrderItemClass OrderItem
Public Name As String
End Class
使用特性的一个好处是:可以在代码和序列化的文档中使用不同的编码规范。
Imports System.Xml.Serialization
如果对XML Serialization缺少了解,请首先参考拙文:在.NET中实现对象序列化
<?xml version="1.0" encoding="utf-8"?>
<order id=”123456”>
<orderDate>2005-04-05</orderDate>
<items>
<item>
<name>对象序列化</name>
</item>
</items>
</order>
上面的例子包含了典型的XML中常见的各种元素:XML声明、XML根节点、XML节点、XML属性、XML集合。除XML声明外,在.NET中都有对应的特性用于定义这些元素。这些特性包括:XmlRootAttribute、XmlTypeAttribute、XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute和XmlArrayItemAttribute。另外,还有两个常用的特性,XmlIgnoreAttribute用于标记在对象序列化时需要被忽略的部分,XmlIncludeAttribute用于标记在生成XML Schema时需要包括的类型。
如果没有显式地标记任何特性,那么默认类的特性为XmlTypeAttribute、类成员的特性为XmlElementAttribute,且名称为类或类成员的名称。例如:
Public Class OrderClass Order
Public ID As String
Public OrderDate As String
End Class
如果不做任何特性标记,使用下面的代码序列化时:
Dim o As New Order
With o
.ID = 123456
.OrderDate = Date.Now.ToShortDateString
End With
Dim writer As New XmlTextWriter("abc.xml", Encoding.UTF8)
Dim serializer As New XmlSerializer(GetType(Order))
writer.Formatting = Formatting.Indented
serializer.Serialize(writer, o)
序列化后的XML为:
<?xml version="1.0" encoding="utf-8"?>
<Order xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ID>123456</ID>
<OrderDate>2005-4-11</OrderDate>
</Order>
可以看到,<Order>对应Order类,而<ID>和<OrderDate>分别对应Order类中的字段ID和OrderDate。另外,多了一个XML声明和两个XML命名空间。
XML声明是.NET自动添加的,但是encoding是在XmlTextWriter中指定的,如果不指定encoding,那么XML声明只有<?xml version="1.0"?>。我使用的是.NET 1.1,这个版本中只支持XML 1.0版本。另外,如果不指定encoding,那么默认的编码可能也是UTF8(没找到相关的资料)。
.NET默认为Order类添加了XMLSchema和XMLSchema-instance两个W3C的命名空间。该命名空间也可以自己指定,方法是使用XmlSerializer的另一个Serialize方法。
Dim ns As New XmlSerializerNamespaces
ns.Add("", "")
writer.Formatting = Formatting.Indented
serializer.Serialize(writer, o, ns)
要将类序列化为XML节点:
<XmlType("order")> _
Public Class OrderClass Order
‘ any code here.
End Class
要将类序列化为XML根节点:
<XmlRoot("order")> _
Public Class OrderClass Order
‘ any code here.
End Class
当在类中同时使用XmlRootAttribute、XmlTypeAttribute时,序列化文档中的类型以XmlRootAttribute为准:
<XmlRoot("order"), XmlType("anotherOrderName")> _
Public Class OrderClass Order
‘ any code here.
End Class
要将类成员序列化为XML节点:
<XmlAttributeAttribute("id")> _
Public ID As String
要将类成员序列化为XML属性:
<XmlAttributeAttribute("id")> _
Public ID As String
要将类成员序列化为XML集合:
<XmlRoot("order"), XmlType("anotherOrderName")> _
Public Class OrderClass Order
<XmlAttributeAttribute("id")> _
Public ID As String
Public orderDate As String
<XmlArray("items"), XmlArrayItem("item", Type:=GetType(OrderItem))> _
Public Items As New ArrayList
End Class
<XmlType("orderItem")> _
Public Class OrderItemClass OrderItem
Public Name As String
End Class
使用特性的一个好处是:可以在代码和序列化的文档中使用不同的编码规范。
相关文章推荐
- 使用序列化实现对象的拷贝
- 理解并学会使用Java对象序列化
- [编写高质量代码:改善java程序的151个建议]建议43 避免对象浅拷贝; 建议44:推荐使用序列化实现对象的深拷贝
- 关于:“无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化
- Android 使用Parcelable序列化对象
- Beetle在TCP通讯中使用二进制序列化对象传输
- 使用Struts 2将Java对象序列化成JSON
- 使用序列化和反序列化来存储一个对象案例
- .NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式
- 使用 dynamic 标记解析JSON字符串 JDynamic :支持Json反序列化为Dynamic对象
- 使用boost库序列化传输对象
- unity中如何使用litjson做对象的序列化
- 对象序列化:使用System.Xml.Serialization命名空间
- Android-Parcelable理解与使用(对象序列化)
- 从文件序列化出对象(使用xml序列化)
- 【Android 】序列化对象接口Parcelable使用方法
- 使用JYaml实现Java对象与Yaml间的序列化与反序列化
- 无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。
- 使用XML文件存取可序列化的对象的类
- java提高篇(五)-----使用序列化实现对象的拷贝