2016-05-25 9 views
0

Ich versuche nur zu deserialisieren und dann, wenn mein Dialog wieder schließt, eine XML-Datei in meiner WPF-App serialisieren. Nun, das funktioniert die meiste Zeit, aber manchmal sind einige Zeichen in meiner Datei komplett verloren, sie verschwinden einfach und machen die Datei unbrauchbar. Mein Code:XMLSerializer zerstört Teile meiner Datei, warum?

public static void WriteXML(MyModel MyModel) 
    {    
     try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(MyModel)); 
      using (var stream = new FileStream(fileName, FileMode.OpenOrCreate)) 
      {      
       serializer.Serialize(stream, MyModel); 
      } 
     } 
     catch (Exception e) 
     { 
      //... 
     } 
    } 

Meine XML-Datei wie folgt aussieht etwas vor und nach:

<?xml version="1.0"?> 
<MainModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Main> 
    <SomeModel> 
     <ID>1</ID> 
     <Name>Af</Name> 
     <SomeMonth>February</SomeMonth> 
     <Level>10</Level> 
     <Out>120</Out> 
     <Hyb>true</Hyb> 
    </SomeModel> 
    <SomeModel> 
     <ID>2</ID> 
     <Name>Alm</Name> 
     <SomeMonth>March</SomeMonth> 
     <Level>5</Level> 
     <Out>90</Out> 
     <Hyb>true</Hyb> 
    </SomeModel> 
    </Main> 
</MainModel> 

Nach:

<?xml version="1.0"?> 
<MainModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><SomeModel> 
     <ID>1</ID> 
     <Name>Af</Name> 
     <SomeMonth>February</SomeMonth> 
     <Level>10</Level> 
     <Out>120</Out> 
     <Hyb>true</Hyb> 
    </SomeModel> 
    <SomeModel> 
     <ID>2</ID> 
     <Name>Alm</Name> 
     <SomeMonth>March</SomeMonth> 
     <Level>5</Level> 
     <Out>90</Out> 
     <Hyb>true</Hyb> 
    </SomeModel> 
    </Main> 
</MainModel> 
+0

Können Sie den Klassencode 'MyModel' ausgeben? –

+1

Sind Sie sicher, dass Sie das korrekte Xml nachher eingefügt haben? Schließen hat kein übereinstimmendes Start-Tag. – loopedcode

+1

Wissen Sie, welche Zeichen dabei verloren gehen? Abgesehen von dem fehlenden Anfangs-Tag sehe ich keine Änderungen in der Vorher- und Nachherzeit. Könnten Sie versuchen, ungültige XML-Zeichen zu senden? – counterflux

Antwort

2

Es ist nicht ganz klar, was mit Ihrem XML passiert (außer es ist ungültig). Sie sagen, es ist "etwas wie das" - was es definitiv aussieht, wäre hilfreich. Ich würde bemerken, dass Sie die falsche FileMode verwenden, also erwarte ich, dass dies ein Teil davon ist, und meine Vermutung ist, dass Ihre tatsächlichen XML MainModel in der ersten Zeile schließt.

FileMode.OpenOrCreate hat diese Kommentare in the documentation:

Gibt an, dass das Betriebssystem eine Datei geöffnet werden soll, wenn es vorhanden ist; Andernfalls sollte eine neue Datei erstellt werden.

Dies bedeutet, dass wenn Ihre Datei bereits existiert (wie es), der Serialisierer nur darauf schreiben wird. Die Datei wird nicht abgeschnitten vor dem Schreiben, also, wenn das, was Sie schreiben, kürzer ist als das, was dort ist, werden Sie am Ende mit einer korrupten Ausgabe aus was Sie geschrieben haben und was vorher da war.

Was Sie wollen, ist FileMode.Create, die diese Kommentare hat:

Gibt an, dass das Betriebssystem eine neue Datei erstellen soll. Wenn die Datei bereits existiert, wird sie überschrieben. ... FileMode.Create entspricht der Anforderung, dass, wenn die Datei nicht existiert, CreateNew; Verwenden Sie andernfalls Abschneiden.

Beachten Sie, dass eine vorhandene Datei wird abgeschnitten werden, was dieses Problem vermeiden wird.

Verwandte Themen