Ce n'est pas le XmlSerializer mais le XmlWriter qui supprime votre CR. Pour le conserver, nous devons faire en sorte que le rédacteur convertisse le CR en son entité de caractère.
.
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 );
}
C'est exactement la même chose avec DataContractSerializer :
var ser = new DataContractSerializer( typeof( Abc ) );
using (XmlWriter wr = XmlWriter.Create( "abc.xml", ws )) {
ser.Serialize( wr, s );
}
Pourquoi devons-nous faire cela ?
En effet, les analyseurs XML conformes doivent, avant l'analyse, traduire CRLF et tout CR non suivi d'un LF en un seul LF. Ce comportement est défini dans la norme Traitement des fins de ligne de la spécification XML 1.0.
Comme cela se produit avant l'analyse syntaxique, vous devez encoder CR comme son entité de caractère si vous voulez que CR existe dans le document.