Question

J'ai une classe avec une propriété marquée par [XmlText], qui accepte la saisie multiligne. Dans mon fichier XML, je l'ai vérifié que les fins de ligne à l'intérieur du contenu du texte sont "\r\n" enfait, le même que le reste du fichier.

Le code que je utilise pour Désérialise:

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

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

Mais, à l'intérieur du setter pour la propriété [XmlText], value a déjà "\n" comme une fin de ligne. La principale raison pour cela est gênant parce que les fins de ligne de "\n" n'affichent pas correctement dans un TextBox ... Je ne sais pas exactement quelle partie est à l'origine des problèmes, mais je pensais que quelqu'un ici pourrait être en mesure de faire la lumière sur la situation .

Était-ce utile?

La solution

J'ai changer l'exemple de code pour le rendre plus facile à mettre rapidement le code dans un environnement de développement C #. J'ai aussi délibérément inclus à l'aide statements- il est seul code exemple.

Pour l'exemple, nous avons la classe de suivi que nous voulons sérialisation:

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

Si nous essayons de sérialisation et la désérialisation cela de la façon que vous décrivez la ligne où « même » est imprimé sur ne sont exécutées (je suppose que le code fonctionnera sur Windows avec Environment.NewLine, remplacer par « \ r \ n » si vous n'êtes pas):

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

Cependant, cela peut être fixé, en affectant manuellement un XmlTextReader au sérialiseur, avec sa propriété de normalisation mis à faux (celui utilisé par défaut dans le sérialiseur est réglé sur vrai):

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

sera de même maintenant Imprimer, qui, à moins que je me trompe est le comportement dont vous avez besoin?

Autres conseils

Si vous étiez sérialisation , puis XmlWriterSettings.NewLineHandling (Replace) serait la peine d'essayer - mais cela ne va pas aider la lecture. Un peu crasseux, mais peut-être faire directement dans le setter:

private string text;
[XmlText]
public string Text {
    get { return text; }
    set 
    {
        Regex r = new Regex("(?<!\r)\n");
        text = r.Replace(value, "\r\n"); 
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top