Это не XmlSerializer, а XmlWriter, который удаляет ваш CR. Чтобы сохранить его, мы должны сделать так, чтобы писатель преобразовал CR в его символьную сущность
.
XmlWriterSettings ws = new XmlWriterSettings();
ws.NewLineHandling = NewLineHandling.Entitize;
XmlSerializer ser = new XmlSerializer( typeof( Abc ) );
using (XmlWriter wr = XmlWriter.Create( "abc.xml", ws )) {
ser.Serialize( wr, s );
}
То же самое с DataContractSerializer:
var ser = new DataContractSerializer( typeof( Abc ) );
using (XmlWriter wr = XmlWriter.Create( "abc.xml", ws )) {
ser.Serialize( wr, s );
}
Зачем нам это нужно?
Это связано с тем, что совместимые анализаторы XML перед синтаксическим анализом должны преобразовать CRLF и любой CR, за которым не следует LF, в один LF. Это поведение определено в разделе Обработка конца строки спецификации XML 1.0.
Поскольку это происходит перед синтаксическим анализом, вам нужно закодировать CR как его символьную сущность, если вы хотите, чтобы CR существовал в документе.