使用C#XmlSerializer反序列化泛型列表的问题

我遇到了微软的.net XmlSerializer的一堵砖墙。 我试图将一些XML反序列化为一个对象,如果我使用单个对象,这很好,但是当将对象放入List并试图序列化/反序列化时,问题就出现了。 首先,这里有一个示例C#windows控制台程序来说明问题:

http://pastebin.com/m22e6e275

如果类“Foo”被序列化为根元素,那么事情表现良好,并且和预期的一样 - JezNamespace xmlns应用于根元素Foo,并且反序列化正常发生。 但是,如果我创建一个List并序列化它,XmlSerializer: - 创建ArrayOfFoo的根元素 - 将Foo元素作为该元素的子元素 - 将Foo的EVERY子元素的xmlns设置为JezNamespace命名空间!

前两个我没问题,但第三个看起来很疯狂......也许是XmlSerializer中的一个错误? 有什么办法可以处理这种行为? 我不想为Foo的每个孩子指定我的命名空间,我只是想为Foo指定它。 如果我这样做了,目前XmlSerializer并没有正确反序列化这个类 - 它只是跳过任何带有JezNamespace xmlns的Foo元素。 我必须将所有子元素设置为具有该xmlns。

我想要的是XmlSerializer生成类似于:

<ArrayOfFoo>
    <Foo xmlns="http://schemas.datacontract.org/2004/07/JezNamespace">
        <Field1>hello</Field1>
        <Field2>world</Field2>
    </Foo>
    <Foo xmlns="http://schemas.datacontract.org/2004/07/JezNamespace">
        <Field1>aaa</Field1>
        <Field2>bbb</Field2>
    </Foo>
</ArrayOfFoo>

...然后让XmlSerializer能够正确地反序列化到List中。 任何想法如何我可以做到这一点?


你的代码在Foo上有两个属性,据我所知,你已经放在那里尝试关联一个名称空间:

 [XmlRootAttribute(Namespace="http://schemas.datacontract.org/2004/07/JezNamespace",
                   IsNullable=false)]
 [XmlTypeAttribute(AnonymousType=true,
                   Namespace="http://schemas.datacontract.org/2004/07/JezNamespace")]

第一个被忽略,因为在你的场景中, Foo不是根元素。 第二个并不完全符合你的想法 - 命名空间是XSD类型的命名空间,而不是元素本身的命名空间。

要指定元素的名称和名称空间,您需要在父类的List<Foo>属性上使用XmlArrayItemAttribute (哦,您将需要该父类):

public class FooParent
{
    [XmlArrayItem(ElementName="Foo",
                  Namespace="http://schemas.datacontract.org/2004/07/JezNamespace")]
    public List<Foo> Foos { get; private set; }
}

这将产生:

<FooParent>
  <Foos>
    <Foo xmlns="http://schemas.datacontract.org/2004/07/JezNamespace">
      <Field1>hello</Field1>
      <Field2>world</Field2>
    </Foo>
    ...

或者,如果您根本不需要Foos中间元素,则可以用上面的代码中的XmlArrayItem替换为XmlElement 。 在这种情况下,输出XML将如下所示:

<FooParent>
  <Foo xmlns="http://schemas.datacontract.org/2004/07/JezNamespace">
    <Field1>hello</Field1>
    <Field2>world</Field2>
  </Foo>
链接地址: http://www.djcxy.com/p/54901.html

上一篇: Problem deserializing generic List's with C# XmlSerializer

下一篇: XmlSerializer giving FileNotFoundException at constructor