2009-07-12 13 views
8

Tengo una clase con una propiedad marcada con [XmlText], que acepta entradas de varias líneas. En mi archivo XML, he verificado que las terminaciones de línea dentro del contenido de texto son de hecho "\r\n", el mismo que el resto del archivo.deserialización XML 'estandarización' de finales de línea, cómo detenerla? (.NET)

El código que estoy usando para deserializar es:

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

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

Pero, dentro del definidor de la propiedad [XmlText], value ya tiene "\n" como un final de línea. La razón principal por la que esto es molesto es porque "\n" terminaciones de línea no se muestran correctamente en un TextBox ... No estoy seguro de qué parte está causando los problemas, pero pensé que alguien aquí podría arrojar algo de luz sobre la situación .

Respuesta

10

he cambiar el código de ejemplo para que sea más fácil para poner rápidamente el código en un entorno de desarrollo C#. También deliberadamente no he incluido el uso de declaraciones; es solo código de muestra.

Por ejemplo, tenemos la clase de seguimiento deseamos serializar:

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

Si tratamos de serializar y deserializar esto de la manera que usted describe la línea en la "misma" que se imprime a cabo no conseguirá ejecutada (estoy suponiendo que el código se ejecutará en Windows con Environment.NewLine, reemplazar por "\ r \ n" si no está):

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"); 
    } 

sin embargo, esto se puede fijar, mediante la asignación manualmente una XMLTextReader a la serializador, con su propiedad de Normalización configurada como falsa (el único uso d por defecto en el serializador se establece en true):

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"); 
    } 

mismo ahora va a imprimir hacia fuera, que si no estoy equivocado es el comportamiento que usted requiere?

+1

Me gusta eso ;-p –

+2

Sin embargo, para el registro, la falta de uso de enunciados en el código de muestra hace que sea más difícil de leer en mi opinión ... nada malo con el uso. –

+0

@ Matthew- Supongo que es una de esas cosas subjetivas: para probar que uno es mejor que el otro realmente necesitarías realizar un experimento controlado. Con mi respuesta, es un poco extraño ya que MemoryStream necesita ser analizado tanto en la serialización como en la deserialización, lo que en el mundo real no sucedería. En el caso de que su pregunta tenga uso de enunciados, es útil (en mi opinión). Cuando estaba escribiendo el código, en realidad incluía las instrucciones de uso, pero las descarté al publicar la respuesta (mi cerebro está conectado para evitar que se queje FXCop). – RichardOD

4

Si se va serialización, a continuación, XmlWriterSettings.NewLineHandling (Replace) valdría la pena intentar - pero esto no va a ayudar a la lectura. Un poco sucio, pero tal vez hacerlo directamente en la incubadora:

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

Sí, estaba pensando que una regex replace podría ser la única solución, pero esperaba que hubiera una "mejor manera" [tm] –

+0

Hay otra manera, no diría que fue mejor- Voy a publicar un responde en breve. – RichardOD

+0

El Regex es un buen ejemplo de averiguar cuándo se usa \ n en lugar de \ r \ n. – RichardOD

Cuestiones relacionadas