XML反序列化“标准化”行结尾,如何阻止它? (。净)

我有一个带有[XmlText]标记属性的类,它接受多行输入。 在我的XML文件中,我已经validation了文本内容中的行结尾是"\r\n" ,与文件的其余部分相同。

我用来反序列化的代码是:

 XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList)); string file = "test.xml"; if (File.Exists(file)) { using (TextReader r = new StreamReader(file)) { foo = configSerializer.Deserialize(r); } } 

但是,在[XmlText]属性的setter中, value已经以"\n"作为行结尾。 这很烦人的主要原因是因为"\n"行结尾在TextBox无法正确显示…我不确定哪个部分导致了这些问题,但我认为这里有人可能能够解决问题关于这种情况。

我已经更改了示例代码,以便更快地将代码放入C#开发环境中。 我还故意不包括使用语句 – 它只是示例代码。

对于示例,我们有我们希望序列化的跟随类:

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

如果我们尝试序列化和反序列化这种方式,你描述打印出“Same”的行将不会被执行(我假设代码将在带有Environment.NewLine的Windows上运行,替换为“\ r \ n”如果你不是):

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

但是,这可以通过手动将XmlTextReader分配给序列化程序来修复,并将其Normalization属性设置为false(序列化程序中默认使用的设置为true):

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

现在将打印出来,除非我错了你需要的行为?

如果你是序列化 ,那么XmlWriterSettings.NewLineHandlingReplace )将值得尝试 – 但这无助于阅读。 有点蹩脚,但也许直接在setter中这样做:

 private string text; [XmlText] public string Text { get { return text; } set { Regex r = new Regex("(?