C#反序列化扩展XML复杂类型

时间:2016-09-14 14:59:42

标签: c# xml serialization xsd

我使用xsd.exe从http://www.gdsregistry.org/3.1/schemas/提供的模式生成代码。

我正在尝试反序列化catalogueItemNofiticationMessage(您可以在此处找到XML:http://www.gs1.se/globalassets/artikelinformation/example-files.zip

我没有大惊小怪地反序列化:

var cinmSerializer = new XmlSerializer(typeof(CatalogueItemNotificationMessageType));
var catalogueItemNotificationMessage = cinmSerializer.Deserialize(new FileStream(path, FileMode.Open)) as CatalogueItemNotificationMessageType;

我的问题发生在DocumentCommandType的文档成员中,它没有正确地反序列化,我只是得到null。

DocumentCommandType在架构中有一个DocumentType引用:

<xsd:complexType name="DocumentCommandType">
    <xsd:sequence>
        <xsd:element name="documentCommandHeader" type="gdsn_common:DocumentCommandHeaderType" />
        <xsd:element ref="gdsn_common:document" maxOccurs="unbounded" />
    </xsd:sequence>
</xsd:complexType>

CatalogueItemNotificationType扩展此类型:

<xsd:complexType name="CatalogueItemNotificationType">
    <xsd:complexContent>
        <xsd:extension base="shared_common:DocumentType">
            <xsd:sequence>
                <xsd:element name="catalogueItemNotificationIdentification" type="shared_common:EntityIdentificationType" />
                <xsd:element name="isReload" type="xsd:boolean" />
                <xsd:element name="catalogueItem" type="catalogue_item_notification:CatalogueItemType" />
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

XML文件有一个带有catalogueItemNotification的documentCommand元素。 xsd.exe似乎正确地获取了继承,因为DocumentType具有正确的XmlIncludeAttribute:

[System.Xml.Serialization.XmlIncludeAttribute(typeof(CatalogueItemNotificationType))]
[...]
public abstract partial class DocumentType {

CatalogueItemNotificationType类具有正确的继承:

public partial class CatalogueItemNotificationType : DocumentType

但是,在对XML文件进行反序列化时,文档字段仍然为空。

我尝试将CatalogueItemNotificationType添加到XmlSerializer构造函数的extraTypes参数,以及使用XmlAttributeOverrides。

1 个答案:

答案 0 :(得分:0)

在调试xmlserializer后想出来。

序列化程序并不了解DocumentType []文档字段可以是基本类型DocumentType。

将以下属性添加到该属性解决了它:

INSERT INTO #TempTable
exec sp_executesql @query