2016-04-16 1 views
1

Je sérialisation une classe (PSD) en utilisant vb.net dans une application Windows Forms:XML désérialisation (Universal App) avec sérialisé vb.net

Dim objStreamWriter As New System.IO.StreamWriter("e:\test.xml") 
Dim x As New System.Xml.Serialization.XmlSerializer(PSD.GetType) 
x.Serialize(objStreamWriter, PSD) 
objStreamWriter.Close() 

Je dois deserialze cette classe dans une application universelle de Windows . Ce est mon code à ce jour:

Dim picker As Windows.Storage.Pickers.FileOpenPicker = New Windows.Storage.Pickers.FileOpenPicker 
picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail 
picker.FileTypeFilter.Add(".xml") 
Dim File As Windows.Storage.StorageFile = Await picker.PickSingleFileAsync 
Dim Fl = Await File.OpenAsync(Windows.Storage.FileAccessMode.Read) 
Dim inStream As Stream = Fl.AsStreamForRead() 
Dim PSD As New PlatinaStammdaten 
Dim serializer = New XmlSerializer(GetType(List(Of PlatinaStammdaten)), New Type() {GetType(PlatinaStammdaten)}) 
PSD = serializer.Deserialize(inStream) 

Ce que je reçois est l'erreur "Il y a une erreur dans le document XML (2, 2)."

Ceci est le début du fichier XML généré par:

<?xml version="1.0" encoding="utf-8"?> 
<Stammdaten xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Lose> 
    <Los> 
     <Name>Sonstige</Name> 
     <KZ>000</KZ> 
    </Los> 
    <Los> 
     <Name>LOS 1; Allgemein/Planung</Name> 
     <KZ>110</KZ> 
    </Los> 
    ... 

Quelle erreur est dans mon code (écriture ou la lecture) qui conduit à cette erreur?

+0

Pour trouver l'utilisation d'erreur xml menu suivant: Projet: Ajouter un nouvel élément: fichier XML. Puis collez le fichier xml dans la fenêtre. L'erreur apparaîtra comme toutes les erreurs du compilateur dans la fenêtre Error List. – jdweng

+0

Aucune erreur n'est affichée –

Répondre

1

Je l'ai travaille maintenant. Ceci est mon code désérialisation maintenant:

Dim picker As Windows.Storage.Pickers.FileOpenPicker = New Windows.Storage.Pickers.FileOpenPicker 
     picker.FileTypeFilter.Add(".xml") 
     Dim File As Windows.Storage.StorageFile = Await picker.PickSingleFileAsync 
     Dim Fl = Await File.OpenAsync(Windows.Storage.FileAccessMode.Read) 
     Dim FileZiel As Windows.Storage.StorageFile = Await File.CopyAsync(FolderZiel, File.Name, Windows.Storage.NameCollisionOption.ReplaceExisting) 
     Dim Fl2 = Await FileZiel.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite) 
     Dim inStream2 As Stream = Fl2.AsStreamForRead() 
     Dim sr As StreamReader = New StreamReader(inStream2) 
     Dim PSD As New PlatinaStammdaten 
     Dim x As New XmlSerializer(PSD.GetType) 
     PSD = x.Deserialize(sr) 
     sr.Dispose() 
0

On dirait que vous essayez de désérialiser une liste en une seule instance

Dim PSD en tant que nouveau PlatinaStammdaten Dim sérialiseur = New XmlSerializer (GetType (List (Of PlatinaStammdaten)), Nouveau Type() {GetType (PlatinaStammdaten)}) PSD = serializer.Deserialize (InStream)

Essayez de changer PSD à

Dim PSD As List(of PlatinaStammdaten) 

puisque nous ne pouvons pas voir le xml complet ou la classe que vous mettez le XML en elle i Difficile de dire si vous rencontrerez d'autres erreurs

+0

Vous êtes sur la bonne voie, mais OP est la sérialisation d'un seul PSD, pas une liste, donc doit désérialiser en un seul. – MrGadget

+0

Oui, j'ai trois classes: Ca, Cb et Cc (pour cet exemple). Avant de sérialiser je crée trois listes de ces classes Dim LA comme liste (Of Ca) et ainsi de suite. Ma classe PSD se compose de trois propriétés (Type: List) et je ne sérialise qu'une seule instance de PSD - donc ce n'est qu'un seul objet. Mon approche est, que je désérialise cette classe donc je reçois trois listes à nouveau –

0

Le code ci-dessous fonctionne

Imports System.Xml 
Imports System.Xml.Serialization 
Imports System.IO 

Module Module1 
    Const FILENAME As String = "c:\temp\test.xml" 
    Sub Main() 
     Dim xs As XmlSerializer = New XmlSerializer(GetType(PlatinaStammdaten)) 
     Dim reader As XmlTextReader = New XmlTextReader(FILENAME) 
     Dim PSD As PlatinaStammdaten = CType(xs.Deserialize(reader), PlatinaStammdaten) 

    End Sub 

End Module 
<XmlRoot("Stammdaten")> _ 
Public Class PlatinaStammdaten 
    Private m_lose As Lose 
    <XmlElement("Lose")> _ 
    Public Property _lose As Lose 
     Get 
      Return m_lose 
     End Get 
     Set(ByVal value As Lose) 
      m_lose = value 
     End Set 
    End Property 
End Class 

<Serializable(), XmlRoot("Lose")> _ 
Public Class Lose 
    Private m_los As List(Of Los) 
    <XmlElement("Los")> _ 
    Public Property _los As List(Of Los) 
     Get 
      Return m_los 
     End Get 
     Set(ByVal value As List(Of Los)) 
      m_los = value 
     End Set 
    End Property 

End Class 

<Serializable(), XmlRoot("Los")> _ 
Public Class Los 
    Private m_Name As String 
    <XmlElement("Name")> _ 
    Public Property name As String 
     Get 
      Return m_Name 
     End Get 
     Set(ByVal value As String) 
      m_Name = value 
     End Set 
    End Property 

    Public m_KZ As Integer 
    <XmlElement("KZ")> _ 
    Public Property KZ As Integer 
     Get 
      Return m_KZ 
     End Get 
     Set(ByVal value As Integer) 
      m_KZ = value 
     End Set 
    End Property 

End Class 

'<Lose> 
' <Los> 
' <Name>Sonstige</Name> 
' <KZ>000</KZ> 
' </Los> 
' <Los> 
' <Name>LOS 1; Allgemein/Planung</Name> 
' <KZ>110</KZ> 
' </Los> 
'</Lose> 
+0

J'essaie de comprendre cela. Où obtenez-vous XmlTextReader? Dans mon application Windows universelle, il n'est pas reconnu. (Comme je l'ai écrit: je sérialiser dans une application Windows Forms et désérialiser dans une application Windows universelle.Et perdre n'est pas une classe dans mon code, mais une liste (de Los) .J'ai besoin de mettre cette liste dans une classe? –

+0

I ne peut pas aider avec le code tiers Code VS/Net juste XmlTextReader est une classe Net Library dans l'espace de noms System.Xml. – jdweng