0

我正在编写一组必须序列化到 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。

感谢您阅读这本小说。我希望有人有一些想法。谢谢!

4

1 回答 1

0

它看起来像一个错误。解决方法似乎是用 替换 XML 文本节点中的所有空格和 crlf 实体。语义相等的实体 ( ) 不起作用。

<root>Leading text <tag>tag1</tag>&#32;&#32;&#32;<tag>tag2</tag></root>

正在为我工​​作。

于 2014-10-02T12:21:30.780 回答