2011-01-06 10 views
4

Wenn Sie diesen Code ausführen:XmlSerializer unzuverlässig oder mache ich etwas falsch?

public class Program 
{ 
    public class MyClass 
    { 
     public string Text { get; set; } 
    } 

    static MyClass myClass = new MyClass(); 
    static string Desktop = "C:\\Users\\Juan Luis\\Desktop\\"; 

    static void Main(string[] args) 
    { 
     myClass.Text = "\r\nhello"; 
     Console.WriteLine((int)myClass.Text[0]); 
     Save(Desktop + "file.xml", myClass); 
     myClass = Load(Desktop + "file.xml"); 
     Console.WriteLine((int)myClass.Text[0]); 
     Console.Read(); 
    } 

    private static MyClass Load(string fileName) 
    { 
     MyClass result = null; 
     using (Stream stream = File.Open(fileName, FileMode.Open)) 
     { 
      XmlSerializer xmlFormatter = new XmlSerializer(typeof(MyClass)); 
      result = (MyClass)xmlFormatter.Deserialize(stream); 
     } 
     return result; 
    } 

    private static void Save(string fileName, MyClass obj) 
    { 
     using (Stream tempFileStream = File.Create(fileName)) 
     { 
      XmlSerializer xmlFormatter = new XmlSerializer(typeof(MyClass)); 
      xmlFormatter.Serialize(tempFileStream, obj); 
     } 
    } 
} 

Der Ausgang wird 13, 10. Die XmlSerializer den Wagenrücklauf zu entfernen. Dies ist ein Problem in meinem Fall, weil ich Zeichenfolgen für die Gleichheit in einer Klasse vergleichen muss, die serialisiert und deserialisiert wird, und dies verursacht zwei Strings, die gleich sind, bevor die Serialisierung nach der Serialisierung ungleich ist. Was wäre die beste Arbeit um?

Edit: Nach dem Lesen Antworten, das ist meine Lösung für den Fall war, wird es jemand helfen:

public class SafeXmlSerializer : XmlSerializer 
{ 
    public SafeXmlSerializer(Type type) : base(type) { } 

    public new void Serialize(Stream stream, object o) 
    { 
     XmlWriterSettings ws = new XmlWriterSettings(); 
     ws.NewLineHandling = NewLineHandling.Entitize; 

     using (XmlWriter xmlWriter = XmlWriter.Create(stream, ws)) 
     { 
      base.Serialize(xmlWriter, o); 
     } 
    } 
} 

Antwort

4

würde ich es nicht nennen unzuverlässig genau: die XmlSerializer Streifen weißen Raum um Text innerhalb Elemente. Wenn dies nicht der Fall wäre, würde sich die Bedeutung von XML-Dokumenten ändern, je nachdem, wie Sie sie in der IDE formatiert haben.

Sie könnten den Text in einen CDATA-Abschnitt einfügen, der den Inhalt genau erhält. Zum Beispiel How do you serialize a string as CDATA using XmlSerializer?

Edit: Das sieht eine bessere Erklärung zu haben, wo das Problem liegt, zusammen mit einer einfacheren Lösung - How to keep XmlSerializer from killing NewLines in Strings?

+0

Haben Sie bedeuten, dass, wenn mein Text sei '„Hallo“' es würde als "Hallo" 'serialisiert werden? Ich habe es gerade getestet und die weißen Bereiche serialisiert. Ich überprüfe trotzdem deinen Link. – Juan

+0

Aus dem Speicher serialisiert es OK, aber es ist erlaubt, Whitespace zu entfernen, wenn es deserialisiert. –

+0

Das wird mein Problem lösen ... aber Wagenrücklauf ist und nicht wie in dieser Antwort angegeben. – Juan

Verwandte Themen