Как десериализовать элемент пространства имен для объекта в .net? - PullRequest
1 голос
/ 08 мая 2010

Учитывая этот фрагмент 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 Ответ

2 голосов
/ 08 мая 2010

Просто укажите пространство имен по умолчанию для использования при вызове конструктора 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...