示例模式:在.NET XML反序列化中,如何允许多态使用数组类型?
<complexType name="Dog">...</complexType>
<complexType name="Cat">...</complexType>
<complexType name="ArrayOfDog">
<sequence>
<element name="Dog" type="tns:Dog minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="Foo">
<sequence>
<element name="Bar" type="string"/>
<element name="Baz" type="anyType"/>
</sequence>
</complexType>
通过.NET的Wsdl.exe用运行这个生成类似下面的代码:
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Dog[]))]
public partial class Dog { ... }
public partial class Cat { ... }
public partial class Foo {
private string barField;
private object bazField;
}
看来,Wsdl.exe用正努力成为“智能”,并认识到我的ArrayOfDog实际上只是一个可以编码为C#数组的包装类型。当ArrayOfDog在另一个数据类型中显式引用时,这工作正常。然而,当ArrayOfDog多态使用时(例如,作为xsd:anyType的替代),这会中断。它似乎中断了,因为.NET运行库对名为“ArrayOfDog”的complexType一无所知 - 它基本上抛弃了这种信息,而仅仅使用本地C#数组。
实施例的XML文档1:
<Foo>
<Bar>Hello</Bar>
<Baz xsi:type="Cat">
...
</Baz>
</Foo>
实施例的XML文档2:
<Foo>
<Bar>Hello</Bar>
<Baz xsi:type="ArrayOfDog">
<Dog>...</Dog>
<Dog>...</Dog>
</Baz>
</Foo>
文献#1由运行时正确地反序列化。我为Bar和Baz获得了正确反序列化字段的Foo类型对象。
运行时,文档#2被反序列化错误地。我得到了一个类型为Foo的对象,其Bar中有一个正确的反序列化字段,但对于Baz字段,我得到了System.XML.XMLNode []。我的猜测是因为运行时对名为“ArrayOfDog”的实体的任何类型绑定一无所知。你可能会认为XmlInclude指令“XmlIncludeAttribute(typeof(Dog []))”会处理这个,但它似乎不工作。
有没有人遇到过这个?
这里有没有优雅的解决方案?我正在考虑使用的解决方法是将我的“ArrayOf”类型封装在另一个类型中,并将其包含在xsd:anyType的替代中。
这是什么情况?一个ASMX网络服务?它返回什么类型?键入Foo?尝试使用“BunchOfDogs”而不是“ArrayOfDog”,这是.NET从Dog []生成的名称。 – 2009-06-17 15:10:50
错误发生在Web服务的C#客户端中。 Web服务的WSDL是用我们上面提到的定义的数据类型来定义的。服务端点使用Java实现。 – Eric 2009-06-17 18:05:11