XmlSerializer ненадежный или я что-то не так делаю? - PullRequest
4 голосов
/ 06 января 2011

Если вы запустите этот код:

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

Выход будет 13, 10. XmlSerializer удаляет возврат каретки.Это проблема в моем случае, потому что мне нужно сравнить строки на равенство в классе, который сериализуется и десериализуется, и это приводит к тому, что две строки, которые равны перед сериализацией, становятся неравными после сериализации.Как лучше всего обойтись?

Редактировать: После прочтения ответов это было мое решение, на случай, если оно кому-нибудь поможет:

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

1 Ответ

4 голосов
/ 06 января 2011

Я бы точно не назвал это ненадежным: XmlSerializer убирает пустое пространство вокруг текста внутри элементов. Если этого не произойдет, значение документов XML изменится в зависимости от того, как вы отформатировали их в IDE.

Вы могли бы рассмотреть возможность помещения текста в раздел CDATA, который точно сохранит содержимое. Например, Как вы сериализуете строку как CDATA, используя XmlSerializer?

Редактировать: Это выглядит, чтобы лучше объяснить, где находится проблема, вместе с более простым решением - Как не позволить XmlSerializer убивать NewLines в строках?

...