Как я могу использовать DataContractSerializer для десериализации из одного узла XMLDocument? - PullRequest
2 голосов
/ 12 января 2011

Считыватели, которые DataContractSerializer использует в ReadObject, кажутся потоковыми.У меня уже есть XMLDocument, и я хотел бы десериализовать одну часть этого документа.

В этом фрагменте кода я десериализирую объект MyItem из файлового потока:

Dim fs As New FileStream("c:\myinputfile.xml", FileMode.Open)
Dim reader As XmlDictionaryReader = XmlDictionaryReader.CreateTextReader(fs, New XmlDictionaryReaderQuotas())
Dim ser As New DataContractSerializer(GetType(MyItemClass))
Dim deserializedMyItem As ClassTemplate = CType(ser.ReadObject(reader, True), MyItemClass)

, но чтоесли вместо этого я хочу десериализовать только часть документа.

Dim MyItemNode as Xml.XmlNode = parentDoc.selectSingleNode("MyItemElementName")
Dim deserializedMyItem As MyItemClass = getMyItemFromNode(MyItemNode)

Как выглядит getMyItemFromNode?

Ответы [ 2 ]

0 голосов
/ 13 января 2011

Используйте [CreateDictionaryReader](http://msdn.microsoft.com/en-us/library/system.xml.xmldictionaryreader.createdictionaryreader.aspx) with an XmlReader`, указывая на нужный вам узел:

Dim doc As XmlDocument = new XmlDocument()
' fill it

Dim nav as XPathNavigator = doc.CreateNavigator()
Dim docReader As XmlReader = nav.ReadSubTree()
Dim reader As XmlDictionaryReader = _
    XmlDictionaryReader.CreateDictionaryReader(docReader)
Dim ser As New DataContractSerializer(GetType(MyItemClass))
0 голосов
/ 12 января 2011

Если нет лучшего способа для потоковой передачи, вот решение с использованием потока памяти:

Function getMyItemFromNode(ByVal itemNode as Xml.XmlNode) as MyItemClass
    Dim stm As New MemoryStream()
    Dim stw  As New StreamWriter(stm)
    stw.Write(itemNode.OuterXml)
    stw.Flush()
    stm.Position = 0
    Dim reader As XmlDictionaryReader = XmlDictionaryReader.CreateTextReader(stm, New XmlDictionaryReaderQuotas())
    Dim ser As New DataContractSerializer(GetType(MyItemClass))
    Return CType(ser.ReadObject(reader, True), MyItemClass)

End Function 

Код для передачи его в поток получен из этого ответа на связанный вопрос.

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