我正在编写一组必须序列化到 Xml 和从 Xml 序列化的对象,遵循我无法更改的严格规范。本规范中的一个元素可以包含字符串和内联元素的混合。
此 Xml 输出的一个简单示例如下:
<root>Leading text <tag>tag1</tag> <tag>tag2</tag></root>
注意第一个标签的结束和第二个标签的开始之间的空白字符。以下是表示此结构的对象:
[XmlRoot("root")]
public class Root
{
[XmlText(typeof(string))]
[XmlElement("tag", typeof(Tag))]
public List<object> Elements { get; set; }
//this is simply for the sake of example.
//gives us four objects in the elements array
public static Root Create()
{
Root root = new Root();
root.Elements.Add("Leading text ");
root.Elements.Add(new Tag() { Text = "tag1" });
root.Elements.Add(" ");
root.Elements.Add(new Tag() { Text = "tag2" });
return root;
}
public Root()
{
Elements = new List<object>();
}
}
public class Tag
{
[XmlText]
public string Text {get;set;}
}
调用 Root.Create() 并使用此方法保存到文件看起来很完美:
public XDocument SerializeToXml(Root obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(Root));
XDocument doc = new XDocument();
using (var writer = doc.CreateWriter())
{
serializer.Serialize(writer, obj);
}
return doc;
}
序列化看起来与本文开头的 xml 结构一模一样。
现在,当我想将 xml 文件序列化回 Root 对象时,我称之为:
public static Root FromFile(string file)
{
XmlSerializer serializer = new XmlSerializer(typeof(Root));
XmlReaderSettings settings = new XmlReaderSettings();
XmlReader reader = XmlTextReader.Create(file, settings);
//whitespace gone here
Root root = serializer.Deserialize(reader) as Root;
return root;
}
问题就在这里。空白字符串被消除。当我调用 Root.Create() 时,Elements 数组中有四个对象。其中之一是空间。这样序列化就好了,但是反序列化时,Elements 中只有 3 个对象。空白字符串被消除。
关于我做错了什么的任何想法?我尝试过使用 xml:space="preserve",以及许多 XmlReader、XmlTextReader 等变体。请注意,当我使用 StringBuilder 读取 XmlTextReader 时,xml 包含我所期望的空格。只有在调用 Deserialize(stream) 时,我才会丢失空格。
这是整个工作示例的链接。它对 LinqPad 很友好,只需复制/粘贴:http ://pastebin.com/8MkUQviB该示例打开两个文件,一个是完美的序列化 xml 文件,第二个是第一个文件的反序列化和再序列化版本。请注意,您必须参考 System.Xml.Serialization。
感谢您阅读这本小说。我希望有人有一些想法。谢谢!