Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反序列化泛型列表时出现问题';使用C#XmlSerializer的s_C#_Serialization - Fatal编程技术网

反序列化泛型列表时出现问题';使用C#XmlSerializer的s

反序列化泛型列表时出现问题';使用C#XmlSerializer的s,c#,serialization,C#,Serialization,我在使用微软的.net XmlSerializer时遇到了一些困难。我试图将一些XML反序列化为一个对象,如果我使用的是单个对象,这很好,但是当一个人将一个对象放入一个列表并尝试序列化/反序列化该对象时,问题就会出现。首先,这里有一个示例C#windows控制台程序来说明问题: 如果将类“Foo”序列化为根元素,则一切正常,正如预期的那样-JezNamespace xmlns应用于根Foo元素,反序列化也正常进行。但是,如果我创建一个列表并序列化它,XmlSerializer: -创建Arra

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

如果将类“Foo”序列化为根元素,则一切正常,正如预期的那样-JezNamespace xmlns应用于根Foo元素,反序列化也正常进行。但是,如果我创建一个列表并序列化它,XmlSerializer: -创建ArrayOfFoo的根元素 -将Foo元素作为该元素的子元素 -将Foo的每个子级的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>

你好
世界
aaa
bbb

。。。然后让XmlSerializer能够将其正确地反序列化到列表中。您知道如何让它这样做吗?

您的代码在
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
属性上使用
XmlArrayItemAttribute
(哦,您将需要该父类):


您的代码在
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
属性上使用
XmlArrayItemAttribute
(哦,您将需要该父类):


嗨,帕维尔,谢谢你那些有用的评论。唯一的问题是,正如您所说的,必须声明FooParent类。这将需要大量的代码重构,因为在我实际需要重构的项目中(我的程序显然只是一个测试用例),与“Foo”相当的是可能需要在列表中返回的大量类。如果没有FooParent包装类,而不是直接序列化/反序列化列表,我绝对不可能实现这种效果吗?我不知道有什么好的方法。最接近的方法是使用CodeDOM或Reflection.Emit在运行时为您生成这些包装器类。好的,谢谢。令人失望的是,微软没有在XMLSerialIZER中提供这个功能。XMLSerialZER是半贬低的(如,在那里,将保留,但是如果可能的话,您应该考虑使用更现代的序列化堆栈)。特别是,在.NET 3 +上,考虑查看DATACONTROTSCORLALTIZER。这本身有一系列的局限性——尽管查看XML时,您没有属性,只有元素,所以应该没问题——但它可以更好地控制序列化的工作方式。嗨,Pavel,感谢您提供的有用的评论。唯一的问题是,正如您所说的,必须声明FooParent类。这将需要大量的代码重构,因为在我实际需要重构的项目中(我的程序显然只是一个测试用例),与“Foo”相当的是可能需要在列表中返回的大量类。如果没有FooParent包装类,而不是直接序列化/反序列化列表,我绝对不可能实现这种效果吗?我不知道有什么好的方法。最接近的方法是使用CodeDOM或Reflection.Emit在运行时为您生成这些包装器类。好的,谢谢。令人失望的是,微软没有在XMLSerialIZER中提供这个功能。XMLSerialZER是半贬低的(如,在那里,将保留,但是如果可能的话,您应该考虑使用更现代的序列化堆栈)。特别是,在.NET 3 +上,考虑查看DATACONTROTSCORLALTIZER。这本身就有一系列限制——尽管查看XML时,没有属性,只有元素,所以应该可以——但它可以更好地控制序列化的工作方式。
<FooParent>
  <Foos>
    <Foo xmlns="http://schemas.datacontract.org/2004/07/JezNamespace">
      <Field1>hello</Field1>
      <Field2>world</Field2>
    </Foo>
    ...
<FooParent>
  <Foo xmlns="http://schemas.datacontract.org/2004/07/JezNamespace">
    <Field1>hello</Field1>
    <Field2>world</Field2>
  </Foo>