2017-12-07 1 views
1

Ich habe ein seltsames Problem mit XML-Deserialisierung in C#. Das Serialisieren des Objekts funktioniert wie erwartet, aber das Deserialisieren macht das Listenwertattribut Files leer.C# - Serialisierungsliste funktioniert, aber Deserialisierung gibt leere Liste zurück

using System; 
using System.Collections.Generic; 
using System.Xml.Linq; 
using System.Xml.Serialization; 
using System.Text; 

namespace Converter 
{ 
    [Serializable] 
    [XmlRoot("userinput")] 
    public class Input 
    { 

     [XmlArray("files")] 
     [XmlArrayItem(Type = typeof(FilePair), ElementName = "filepair")] 
     public List<FilePair> Files; 


     public Input() 
     { } 

    } 
} 

und das Element:

using System; 
using System.Collections.Generic; 
//using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 

namespace Converter 
{ 
    [Serializable] 
    public class FilePair 
    { 
     [XmlElement("file1")] 
     public string File1; 

     [XmlElement("file2")] 
     public string File2; 

     public FilePair() { } 

    } 

    public enum FileSource { Foo, Bar }; 
} 

und eine XML-Beispiel:

<userinput> 
    <files> 
     <filepair> 
     <file1>foo</file1> 
     <file2>bar</file2> 
     </filepair> 
     <filepair> 
     <file1>foo</file1> 
     <file2>bar</file2> 
     </filepair> 
    </files> 
</userinput> 
+0

Überprüfen Sie diese kann helfen https://StackOverflow.com/Questions/517064/deserializing-a-generic-List-ReTurns-Null –

+0

wenn ich dies versuche, bekomme ich "Das XML-Element 'file1' aus Namespace ' 'ist bereits im aktuellen Bereich vorhanden. Verwenden Sie XML-Attribute, um einen anderen XML-Namen oder Namespace für das Element anzugeben. " - Ist das dein tatsächlicher Code? vermutlich meinst du '[XmlElement (" file2 ")]'? –

+0

@MarcGravell Nein Ich habe ein bisschen anonymisiert, da es mir nicht behagt, den tatsächlichen Code von der Arbeit aus zu posten. Die zweite "Datei1" sollte "Datei2" lesen. Mein schlechtes, aber nicht das Problem im ursprünglichen Code. Ich habe meine Antwort bearbeitet, um das zu korrigieren. – kutschkem

Antwort

0

Wenn ich den Code nehmen, fixieren Sie die [XmlElement("file2")] und Verwendung:

var xml = @"<userinput> 
<files> 
    <filepair> 
    <file1>foo</file1> 
    <file2>bar</file2> 
    </filepair> 
    <filepair> 
    <file1>foo</file1> 
    <file2>bar</file2> 
    </filepair> 
</files> 
</userinput>"; 
    using (var reader = new StringReader(xml)) 
    { 
     var obj = (Input)new XmlSerializer(typeof(Input)).Deserialize(reader); 
     foreach(var file in obj.Files) 
     { 
      Console.WriteLine($"{file.File1}, {file.File2}"); 
     } 
    } 

dann: es funktioniert. Die Ausgabe ist:

foo, bar 
foo, bar 

Also: was auch immer das Problem ist: Sie haben es bei der Erstellung Ihrer minimalen Probe behoben.

So jetzt die Frage wird: Was unterscheidet zwischen Ihrer minimalen Probe und Ihrem echten Code? Beantworte das und du wirst die Frage selbst beantworten.

+0

Nun, das ist scheiße, denke ich. Ok, ich werde sehen, wie viel ich den Code reduzieren kann, so dass es immer noch nicht funktioniert, und komme zurück. – kutschkem

+0

Es stellt sich heraus, was eigentlich falsch ist, ist mein Testcode. Ich überprüfe Äquivalenz mit CollectionAssert.AreEquivalent, was zu der Annahme führt, dass es 0 Elemente in der deserialisierten Liste gibt, was nicht wahr ist. Stattdessen denke ich, der Vergleich funktioniert durch Verweis wie hier https://stackoverflow.com/questions/15821628/collectionassert-areequivalent-failing-cant-figure-out-why und ich muss einen Gleichheitstest oder etwas implementieren. Danke für die doppelte Überprüfung des Codes. Diese Fehlermeldung war ein wenig irreführend. Nach der Implementierung von Equals und Hashcode auf FilePair funktioniert der Test. – kutschkem

+0

@ kutschkem Lernpunkt dann: wenn Sie nur extra 3 Minuten gebraucht hätten, um Ihr Beispiel (was gut war - keine Beschwerden dort) in ein * runnable * Beispiel zu verwandeln, hätten Sie gesehen, dass das Problem nicht aufgetreten ist :) –

Verwandte Themen