2009-07-12 3 views
8

Ich habe eine Klasse mit einer Eigenschaft markiert mit [XmlText], die mehrzeilige Eingabe akzeptiert. In meiner XML-Datei habe ich überprüft, dass die Zeilenenden innerhalb des Textinhalts genau wie der Rest der Datei infact "\r\n" sind.XML-Deserialisierung "Standardisierung" Zeilenenden, wie man es stoppt? (.NET)

Der Code Ich verwende deserialisiert ist:

XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList)); 
string file = "test.xml"; 

if (File.Exists(file)) 
{ 
    using (TextReader r = new StreamReader(file)) 
    { 
     foo = configSerializer.Deserialize(r); 
    } 
} 

Aber in der Setter für die [XmlText] Eigenschaft, value hat bereits "\n" als Zeilenende. Der Hauptgrund dafür ist, dass "\n" Zeilenendungen in einem TextBox nicht richtig angezeigt werden ... Ich bin nicht genau sicher, welcher Teil die Probleme verursacht, aber ich dachte, dass jemand hier in der Lage sein könnte, etwas Licht auf die Situation zu werfen .

Antwort

10

Ich habe den Beispielcode ändern zu erleichtern, um schnell den Code in eine C# Entwicklungsumgebung zu setzen. Ich habe auch bewusst keine Anweisungen verwendet - es ist nur Beispielcode.

Für das Beispiel wir die Folge Klasse wünschen wir serialisiert:

public class DataToSerialize 
    { 
     public string Name { get; set; } 
    } 

Wenn wir dies versuchen, serialisiert und deserialisiert in der Art und Weise Sie die Linie beschreiben, wo „Same“ ausgedruckt wird nicht ausgeführt werden sollen (ich gehe davon aus dem Code wird mit Environment.NewLine unter Windows ausführen, ersetzen mit „\ r \ n“, wenn Sie nicht sind):

DataToSerialize test = new DataToSerialize(); 
    test.Name = "TestData" + Environment.NewLine; 
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize)); 
    MemoryStream ms = new MemoryStream(); 
    StreamWriter sw = new StreamWriter(ms); 
    configSerializer.Serialize(sw, test); 
    ms.Position = 0; 
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(ms); 
    if (deserialized.Name.Equals("TestData" + Environment.NewLine)) 
    { 
     Console.WriteLine("Same"); 
    } 

jedoch kann dieses Problem behoben werden, indem manuell eine XmlTextReader auf die Zuweisung von Serialisierer, dessen Eigenschaft Normalization auf false gesetzt ist d standardmäßig in der Serializer auf true gesetzt):

DataToSerialize test = new DataToSerialize(); 
    test.Name = "TestData" + Environment.NewLine; 
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize)); 
    MemoryStream ms = new MemoryStream(); 
    StreamWriter sw = new StreamWriter(ms); 

    configSerializer.Serialize(sw, test); 
    ms.Position = 0; 
    XmlTextReader reader = new XmlTextReader(ms); 
    reader.Normalization = false; 
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(reader); 
    if (deserialized.Name.Equals("TestData" + Environment.NewLine)) 
    { 
     Console.WriteLine("Same"); 
    } 

Same wird nun ausdrucken, die es sei denn, ich bin falsch ist das Verhalten, das Sie benötigen?

+1

Ich mag das; -p –

+2

Für den Rekord, macht das Fehlen von Anweisungen in Beispielcode es schwieriger zu lesen meiner Meinung nach ... nichts falsch mit der Verwendung. –

+0

@ Matthew - ich denke, es ist eines dieser subjektiven Dinge - zu beweisen, dass man besser ist als das andere, das man wirklich braucht, um ein kontrolliertes Experiment durchzuführen. Mit meiner Antwort ist es ein wenig merkwürdig, da der MemoryStream sowohl auf die Serialisierung als auch auf die Deserialisierung beschränkt werden muss, was in der realen Welt nicht passieren würde. Im Falle Ihrer Frage ist die Verwendung von Aussagen nützlich (meiner Meinung nach). Als ich den Code schrieb, habe ich tatsächlich die using-Anweisungen eingefügt, aber beim Veröffentlichen der Antwort herausgerissen (mein Gehirn ist so verkabelt, dass sich FXCop nicht beschweren). – RichardOD

4

Wenn Sie Serialisierung sind, dann XmlWriterSettings.NewLineHandling (Replace) wären ein Versuch wert - aber das wird das Lesen nicht helfen. Ein bisschen grungy, aber vielleicht in dem Setter direkt tun:

private string text; 
[XmlText] 
public string Text { 
    get { return text; } 
    set 
    { 
     Regex r = new Regex("(?<!\r)\n"); 
     text = r.Replace(value, "\r\n"); 
    } 
} 
+0

Ja, ich dachte, eine Regex ersetzen könnte die einzige Lösung sein, aber ich hatte gehofft, es gab etwas "besseren Weg" [ –

+0

Es gibt einen anderen Weg, ich würde nicht sagen, es war besser- ich werde eine Post antworte kurz. – RichardOD

+0

Der Regex ist ein schönes Beispiel, um herauszufinden, wann nur \ n anstelle von \ r \ n verwendet wird. – RichardOD