如何将命名空间元素反序列化为.net中的对象?

时间:2010-05-07 20:33:18

标签: .net serialization

鉴于此XML片段:

...
<InSide:setHierarchyUpdates>
   <automaticUpdateInterval>5</automaticUpdateInterval>
   <shouldRunAutomaticUpdates>true<shouldRunAutomaticUpdates>
</InSide:setHierarchyUpdates>
...

我正在尝试序列化此对象:

Imports System.Xml.Serialization
<XmlRoot(ElementName:="setHierarchyUpdates", namespace:="InSide")> _
Public Class HierarchyUpdate
    <XmlElement(ElementName:="shouldRunAutomaticUpdates")> _
    Public shouldRunAutomaticUpdates As Boolean
    <XmlElement(ElementName:="automaticUpdateInterval")> _
      Public automaticUpdateInterval As Integer
End Class

像这样:

Dim hierarchyUpdater As New HierarchyUpdate
Dim x As New XmlSerializer(hierarchyUpdater.GetType)
Dim objReader As Xml.XmlNodeReader = New Xml.XmlNodeReader(myXMLNode)
hierarchyUpdater = x.Deserialize(objReader)

但是,反序列化后,对象的值为false和零。如果我将objReader切换到一个流读取器并将其作为一个文件读取,没有它的父节点和没有命名空间,它就可以工作:

<setHierarchyUpdates>
   <automaticUpdateInterval>5</automaticUpdateInterval>
   <shouldRunAutomaticUpdates>true<shouldRunAutomaticUpdates>
</setHierarchyUpdates>

我做错了什么?我应该在类定义中使用除XMLRoot之外的东西,因为作为XML节点,它不是真正的根节点吗?如果是这样,什么?为什么在失败时没有返回错误?

1 个答案:

答案 0 :(得分:2)

只需指定在调用XmlSerializer构造函数时使用的默认命名空间:

Dim hierarchyUpdater As New HierarchyUpdate
Dim x As New XmlSerializer(hierarchyUpdater.GetType, "http://yournamespace.org")
Dim objReader As Xml.XmlNodeReader = New Xml.XmlNodeReader(myXMLNode)
hierarchyUpdater = x.Deserialize(objReader)

注意:您使用的InSide很可能只是XML名称空间前缀 - 而不是真正的XML名称空间。在XML文档的某处,您应该看到如下定义:

xmlns:InSide="http://yournamespace.org"  

(或类似的东西) - 你需要在XmlSerializer构造函数调用中使用实际的命名空间 - 而不是前缀 -