Мы используем DataContractSerializer
для сериализации наших данных в XML. Недавно мы обнаружили ошибку, связанную с тем, как строка "\r\n"
сохраняется и читается обратно - она превратилась в "\n"
. Очевидно, что это вызвано использованием XmlWriter
с набором Indent = true
:
// public class Test { public string Line; }
var serializer = new DataContractSerializer(typeof(Test));
using (var fs = File.Open("C:/test.xml", FileMode.Create))
using (var wr = XmlWriter.Create(fs, new XmlWriterSettings() { Indent = true }))
serializer.WriteObject(wr, new Test() { Line = "\r\n" });
Test test;
using (var fs = File.Open("C:/test.xml", FileMode.Open))
test = (Test) serializer.ReadObject(fs);
Очевидное решение состоит в том, чтобы прекратить делать отступ в XML, и действительно удаление строки "XmlWriter.Create
" делает правильное возвращение значения Line
, будь то "\n"
, "\r\n"
или что-то еще.
Тем не менее, способ, которым DataContractSerializer
пишет, все же кажется не совсем безопасным или, возможно, даже правильным - например, простое чтение полученного файла с помощью XML Notepad и его повторное сохранение разрушает как "\n"
, так и "\r\n"
значения полностью.
Какой правильный подход здесь? Является ли использование XML в качестве формата для сериализации двоичных данных ошибочной концепцией? Неправильно ли ожидать, что такие инструменты, как XML Notepad, не повредят нашим данным? Нужно ли дополнять каждое string
поле, которое может содержать такой текст, с помощью какого-либо специального атрибута, возможно, для принудительной установки CDATA?