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

Mat*_*ley 9 c# xml newline xml-serialization

我有一个标有属性的类[XmlText],它接受多行输入.在我的XML文件中,我已经验证了文本内容中的行结尾是非常的"\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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在该[XmlText]物业的制定者内部,value已经有"\n"一条线结束.这令人讨厌的主要原因是因为"\n"线路末端没有正确显示TextBox...我不确定哪个部分导致了问题,但我认为这里的某个人可能能够对这种情况有所了解.

Ric*_*dOD 11

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

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

   public class DataToSerialize
   {
       public string Name { get; set; }
   }
Run Code Online (Sandbox Code Playgroud)

如果我们尝试序列化和反序列化这种方式,你描述打印出"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");
    }
Run Code Online (Sandbox Code Playgroud)

但是,这可以通过手动将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");
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 但是,对于记录,示例代码中缺少using语句使我更难以阅读...使用时没有任何问题. (2认同)

Mar*_*ell 5

如果您正在序列化,那么XmlWriterSettings.NewLineHandling( Replace) 值得一试——但这无助于阅读。有点脏,但也许可以直接在 setter 中执行此操作:

private string text;
[XmlText]
public string Text {
    get { return text; }
    set 
    {
        Regex r = new Regex("(?<!\r)\n");
        text = r.Replace(value, "\r\n"); 
    }
}
Run Code Online (Sandbox Code Playgroud)