c#,不能DeSerialize XMl文件

时间:2014-01-24 19:30:50

标签: c# xml web-services deserialization xml-deserialization

我需要向Web服务发送请求。此请求要求"会话"对象作为参数。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.18060")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0")]
public partial class session {

    private object[] itemsField;

    private string idField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("data", typeof(sessionData))]
    [System.Xml.Serialization.XmlElementAttribute("properties", typeof(sessionProperties))]
    public object[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }
}

这是我的xml文件。

    <session id="6055">
      <properties dateModified="2014-01-08" engineVersion="2.0" cultureCode="en-US" cultureName="United States [english]">
        <userName>admin</userName>
      </properties>
      <data id="d2311A049FDC64CD9AE9EF3DE5874CB2D">
        .....
      </data>
    </session>

当我反序列化这个xml文件时,我只得到id,items总是为null。顺便说一句,会话类来自Web服务,我无法改变它。

    public static session GetSession()
    {
        var s = new session();
        var data = new sessionData();

        var sessionXml = @"C:\Projects\CFWinSvc - Copy\XmlDeSerialize\session.xml";

        using (TextReader reader = new System.IO.StreamReader(sessionXml))
        {
            var serializer = new XmlSerializer(typeof(session));
            s = (session)serializer.Deserialize(reader);
        }

        return s;

    }


    public static session GetSession()
    {
        var s = new session();
        var data = new sessionData();


        var sessionXml = @"C:\Projects\CFWinSvc - Copy\XmlDeSerialize\session.xml";

        using (TextReader reader = new System.IO.StreamReader(sessionXml))
        {
            var serializer = new XmlSerializer(typeof(session));
            s = (session)serializer.Deserialize(reader);
        }

        return s;

    }

更新

这里是XML Schema。

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns="http://www.cfins.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xs:element name="session">
            <xs:complexType>
                <xs:sequence>
                    <xs:choice maxOccurs="unbounded">
                        <xs:element name="properties">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="userName" type="xs:string"/>
                                </xs:sequence>
                                <xs:attribute name="dateModified" use="optional"/>
                                <xs:attribute name="engineVersion" type="xs:string" use="optional"/>
                                <xs:attribute name="cultureCode" type="xs:string" use="optional"/>
                                <xs:attribute name="cultureName" type="xs:string" use="optional"/>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="data">
                            <xs:complexType>
                                <xs:all>
                                    <xs:element name="AlwaysAddIDs" type="xs:boolean" minOccurs="0"/>
                                    <xs:element name="ProRatingOn" type="xs:boolean" minOccurs="0"/>
                                    <xs:element name="carrier" minOccurs="0">
                                        <xs:complexType>
                                            <xs:attribute name="id" type="xs:string" use="optional"/>
                                        </xs:complexType>
                                    </xs:element>
                                    <xs:element name="userinterface" minOccurs="0">
                                        <xs:complexType>
                                            <xs:attribute name="id" type="xs:string" use="optional"/>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:all>
                                <xs:attribute name="id" type="xs:string" use="optional"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:choice>
                </xs:sequence>
                <xs:attribute name="id" use="optional"/>
            </xs:complexType>
        </xs:element>
    </xs:schema>

3 个答案:

答案 0 :(得分:1)

您的会话课没有任何问题。 但是,它标记为

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0")]

这几乎意味着xml反序列化器只会考虑session中位于同一xml名称空间中的子元素。

简而言之,将丑陋的命名空间定义添加到xml文件中,如下所示:

<properties xmlns="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0" ...

将解决这个问题:你将获得所需的所有sessionProperties和sessionData。

答案 1 :(得分:0)

XmlElement不应用于集合或数组属性。应该使用XmlArrayXmlArrayItem代替。我不知道为什么会像上面显示的那样生成代码。它是在生成后修改的吗?如果您共享架构,我们可以通过codegen确定问题。

[XmlArray]
[XmlArrayItem("data", typeof(sessionData))]
[XmlArrayItem("properties", typeof(sessionProperties))]
public object[] Items {
    get {
        return this.itemsField;
    }
    set {
        this.itemsField = value;
    }
}

答案 2 :(得分:0)

要使用Xml序列化,所有属性都需要有一个公共getter和setter,否则就是反射器,同时拒绝序列化或反序列化你的对象。