2016-04-16 8 views
1

ich eine Klasse bin Serialisierung (PSD) mit vb.net in einer Windows Forms-Anwendung:Deserialisieren (Universal App) XML mit vb.net serialisiert

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() 

Ich brauche diese Klasse in einer Windows-Universal-App deserialze . Dies ist mein Code so weit: "Es ist ein Fehler in XML-Dokument (2, 2)"

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) 

Was ich erhalte, ist der Fehler

Dies ist der Anfang der generierten XML-Datei:

<?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> 
    ... 

Welche Fehler in meinem Code (Schreiben oder Lesen), die zu diesem Fehler führt?

+0

Um die XML-Fehler Verwendung folgenden Menü zu finden: Projekt: Neues Element hinzufügen: XML-Datei. Fügen Sie dann die XML-Datei in das Fenster ein. Der Fehler wird wie alle Compilerfehler im Fenster Fehlerliste angezeigt. – jdweng

+0

Es wird kein Fehler angezeigt –

Antwort

1

Ich habe es funktioniert jetzt. Das ist mein Deserialisieren Code jetzt:

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

Sieht aus wie Sie versuchen, sich eine Liste in einer einzigen Instanz

Dim PSD As New PlatinaStammdaten Dim Serializer = New XmlSerializer (GetType (Liste deserialisieren (Of PlatinaStammdaten)), New Type() {GetType (PlatinaStammdaten)}) PSD = serializer.Deserialize (inStream)

Versuchen PSD zu

Dim PSD As List(of PlatinaStammdaten) 

zu ändern, da wir die volle xml oder die Klasse nicht sehen kann die xML in sie setzen i ist schwer zu sagen, wenn Sie irgendwelche anderen Fehler auftreten wird

+0

Sie sind auf dem richtigen Weg, aber OP serialisiert eine einzelne PSD, keine Liste, muss also zu einem einzigen deserialisieren. – MrGadget

+0

Ja, ich habe drei Klassen: Ca, Cb und Cc (für dieses Beispiel). Vor dem Serialisieren erstelle ich drei Listen dieser Klassen Dim LA als Liste (Of Ca) und so weiter. Meine Klasse PSD besteht aus drei Eigenschaften (Typ: Liste) und ich serialisiere nur eine einzige Instanz von PSD - also ist es nur ein Objekt. Mein Ansatz ist, dass ich diese Klasse deserialize, damit ich wieder drei Listen bekomme –

0

Der folgende Code funktioniert

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

Ich versuche das zu verstehen. Woher bekommst du XmlTextReader? In meiner Windows Universal App wird es nicht erkannt. (Wie ich geschrieben habe: Ich serialisiere in einer Windows Forms Anwendung und Deserialisierung in einer Windows Universal App. Und Verlieren ist keine Klasse in meinem Code, sondern eine Liste (von Los). Ich muss diese Liste in eine Klasse setzen? –

+0

I kann nicht mit Code von Drittanbietern helfen Nur VS/Net-Code XmlTextReader ist eine Net Library-Klasse im System.Xml-Namespace. – jdweng

Verwandte Themen