C# XML反序列化&x27;标准化';行尾,如何阻止它?(.NET)

C# XML反序列化&x27;标准化';行尾,如何阻止它?(.NET),c#,xml,xml-serialization,newline,C#,Xml,Xml Serialization,Newline,我有一个类,它的属性标记为[XmlText],接受多行输入。在我的XML文件中,我已经验证了文本内容中的行尾实际上是“\r\n”,与文件的其余部分相同 我用来反序列化的代码是: XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList)); string file = "test.xml"; if (File.Exists(file)) { using (TextReader r = new StreamRe

我有一个类,它的属性标记为
[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);
    }
}

但是,在
[XmlText]
属性的setter中,
已经有
“\n”
作为行尾。这很烦人的主要原因是
“\n”
行尾不能正确显示在
文本框中。。。我不确定是哪一部分导致了问题,但我想这里的某个人可能能够解释一下情况。

如果你是序列化,那么
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"); 
    }
}
私有字符串文本;
[XmlText]
公共字符串文本{
获取{返回文本;}
设置
{

Regex r=new Regex(“(?我已经更改了示例代码,使其更容易快速地将代码放入C#开发环境中。我还特意不包括使用语句—它只是示例代码

对于该示例,我们希望序列化以下类:

   public class DataToSerialize
   {
       public string Name { get; set; }
   }
如果我们尝试以您描述的方式对其进行序列化和反序列化,则不会执行打印出“Same”的行(我假设代码将在Windows with Environment.NewLine上运行,如果不执行,则替换为“\r\n”):

但是,可以通过手动将XmlTextReader分配给序列化程序,并将其规范化属性设置为false(序列化程序中默认使用的属性设置为true)来解决此问题:


现在也会打印出来,除非我错了,否则这是您需要的行为?

是的,我认为正则表达式替换可能是唯一的解决方案,但我希望有一些“更好的方法”[tm]还有另一种方法,我不会说它更好-我很快会发布一个答案。正则表达式是一个很好的例子,它可以发现何时只使用了\n而不是\r\n。不过,作为记录,在我看来,在示例代码中缺少使用语句会使阅读变得更困难…使用它没有错。@Matthew-我想这是主观的事情之一-使用它证明一个比另一个好,你真的需要执行一个受控实验。我的回答有点奇怪,因为MemoryStream需要在序列化和反序列化两个方面都有作用域,这在现实世界中是不会发生的。在你的问题中,使用语句是有用的(在我看来).当我写代码时,我实际上包含了using语句,但在发布答案时将它们撕掉了(我的大脑被连接起来以防止FXCop抱怨)。“我的大脑被连接起来以防止FXCop抱怨”-根据我的经验,这只能是一件好事。
    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");
    }
    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");
    }