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)
现在将打印出来,除非我错了你需要的行为?
如果您正在序列化,那么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)
| 归档时间: |
|
| 查看次数: |
6183 次 |
| 最近记录: |