0

这是一个有点长的问题,但我已经尽可能简洁了,所以请多多包涵。在我看来,这就像XmlSerializer课堂上的一个错误,但在我将它提交给 Microsoft 之前,我想看看是否有任何我遗漏的东西,这是完全可能的。

我正在尝试生成以下 XML 作为代表性案例,它本质上是集合的集合,但外部集合具有其他元素:

<Links>
  <Name />
  <Group>
    <Link />
    <Link />
  </Group>
  <Group>
    <Link />
    <Link />
  </Group>
</Links>

序列化类如下:

public class Link { }

public class Links
{
    public string Name { get; set; }

    [XmlElement("Group")]
    public Link[][] Groups { get; set; }
}

运行它的简单测试程序如下:

class Program
{
    static void Main()
    {
        var serializer = new XmlSerializer(typeof(Links));
        var links = new Links { Name = "", Groups = new[] { 
            new[] { new Link(), new Link() }, 
            new[] { new Link(), new Link() } } };
        serializer.Serialize(Console.Out, links);
    }
}

这采用了usingXmlElement删除集合的父节点的技巧,这意味着不会<Groups>发出任何元素,并且对于外部数组中包含的每个对象(将是 type Link[]),<Group>都应该发出一个元素。但是,在运行时,这会产生以下异常XmlSerializer

无法生成临时类(结果=1)。错误 CS0030:无法将类型“Link[][]”转换为“Link[]”错误 CS0029:无法将类型“Link[]”隐式转换为“Link[][]”

我的猜测是,序列化程序出于某种原因试图展平集合,并认为外部数组中包含的类型是Link而不是Link[]导致其序列化类的编译失败,因为类型不匹配。

你怎么看?这是一个错误吗?并且有没有一种解决方法来生成我使用后的 XML XmlSerializer

4

3 回答 3

1

I would suggest writing an XML schema, which defines the syntax you want to have in your XML and than generate the corresponding serialization code from it using a code generation tool (e.g. MS xsd.exe). Writing a schema is a good approach for data validation anyway. Even if you do not want to use it later and rather want to maintain the code yourself, you can at least have a look at the generated code.

于 2010-01-18T16:57:21.737 回答
1

我可以使用 XmlArrayItem 属性获得几乎相同的结构:

[XmlArrayItem(ElementName = "Group", Type = typeof(Link[]))]
Link[][] Groups;

但我仍然得到一个顶级组元素。至少锯齿状数组的序列化以这种方式工作。

就我的测试而言,没有办法让 XmlElement 属性与锯齿状数组一起使用。我不确定这是错误还是“功能”。我同意,从错误消息来看,这看起来像是一个错误。至少它应该抛出不支持具有锯齿状数组属性的 XmlElement,而不是在尝试将 [] 放入 [][] 时失败。

于 2010-01-18T12:00:47.453 回答
0

就我所见,问题正是错误所在。

您为要序列化的类编写所需的 XML 的方式表明 Group 是链接的集合;但是,它被定义为锯齿状的链接数组(即数组数组)。

相信你把它还原成一个简单的数组,问题就解决了。


编辑添加

如果你真的需要你指定的 XML,你可以实现IXmlSerializable接口并自己创建和读取 XML。

当事情不像我们期望的那样工作时,它总是一个解决方案。

于 2010-01-18T11:48:07.830 回答