C#反序列化列表计数零

时间:2016-01-07 16:57:57

标签: c# xml serialization deserialization

在让我的课程正确反序列化方面遇到一些麻烦。

其他反序列化类工作正常并且看起来性质相似但是当反序列化器运行时,我得到ErrorDetail和String列表的0计数。

我错过了哪些错误?

XML:

<PlaceOrderResponse
    xmlns="http://blah.co.uk">
    <PlaceOrderResult
        xmlns:a="http://blah.co.uk/WebserviceMessage"
        xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:ErrorDetails
            xmlns:b="http://blah.co.uk/Error">
            <b:ErrorDetail>
                <b:Code>1fasd</b:Code>
                <b:Message>Explain</b:Message>
            </b:ErrorDetail>
        </a:ErrorDetails>
        <a:ID i:nil="true"/>
        <a:InformationalMessages
            xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
            <a:Status>1</a:Status>
        </PlaceOrderResult>
    </PlaceOrderResponse>

C#Classes:

[Serializable()]
    [XmlRoot(ElementName = "PlaceOrderResponse", Namespace = "http://blah.co.uk", IsNullable = false)]
    [XmlType(AnonymousType = true, Namespace = "http://blah.co.uk")]
    public class PlaceOrderResponse
    {
        [XmlElement(ElementName = "PlaceOrderResult")]
        public PlaceOrderResult placeOrderResult { get; set; }
    }

    [XmlRoot(ElementName = "PlaceOrderResult")]
    public class PlaceOrderResult : WebserviceMessage { }

[XmlRoot(Namespace = "http://blah.co.uk/WebserviceMessage")]
    [XmlType(AnonymousType = true)]
    public class WebserviceMessage
    {
        [XmlArray("ErrorDetails")]
        [XmlArrayItem("ErrorDetail", typeof(ErrorDetail))]
        public ErrorDetails errorDetails { get; set; }
        [XmlElement("ID")]
        public string ID { get; set; }
        [XmlArray("InformationMessages")]
        [XmlArrayItem(typeof(String))]
        public List<String> InformationMessages { get; set; }
        [XmlElement("Status")]
        public string Status { get; set; }
    }

[XmlRoot(ElementName = "ErrorDetails")]
    [XmlTypeAttribute(AnonymousType = true)]
    public class ErrorDetails : List<ErrorDetail> { }

    [XmlRoot(ElementName = "ErrorDetail", Namespace = "http://blah.co.uk/Error")]
    [XmlTypeAttribute(AnonymousType = true)]
    public class ErrorDetail
    {
        [XmlElement(ElementName = "Code")]
        public string Code { get; set; }
        [XmlElement(ElementName = "Message")]
        public string Message { get; set; }
    }

4 个答案:

答案 0 :(得分:3)

您的XmlArrayItem将从其父级继承其命名空间。所以你需要明确地包含这个:

[XmlArrayItem("ErrorDetail", typeof(ErrorDetail), Namespace = "http://blah.co.uk/Error")].

关于信息性消息,没有要加载的字符串,因此很难分辨XML 应该的样子。它会期望<string>message</string>

形式的元素

作为提示,调试这些问题的最简单方法是尝试相反的方法 - 创建一个对象并将其序列化为XML。然后将它与你试图去除的东西进行比较,你会发现很容易发现差异所在。

答案 1 :(得分:1)

除了XmlRoot的根元素之外,您的PlaceOrderResponse属性对任何类都没有任何好处。您需要将相应的命名空间添加到XmlArrayItem属性中。

例如:

[XmlArray("ErrorDetails")]
[XmlArrayItem("ErrorDetail", typeof(ErrorDetail), Namespace = "http://blah.co.uk/Error")]
public ErrorDetails errorDetails { get; set; }

答案 2 :(得分:0)

我没有手工完成它,但我只能假设你的课程在某种程度上是错误的。使用下面的类和您的XML我能够正确地反序列化。

我认为你为了简洁而错过了XML的标题?

<?xml version="1.0" encoding="utf-8"?>

如果我错了,我会仔细检查和编辑帖子但你知道在.NET 4.5和Visual Studio 2013上你可以去编辑&gt;选择性粘贴&gt;将XML粘贴为Class并让Visual Studio为您编写类?这就是我所做的。

<强>类

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://blah.co.uk", IsNullable = false)]
public partial class PlaceOrderResponse
{

    private PlaceOrderResponsePlaceOrderResult placeOrderResultField;

    /// <remarks/>
    public PlaceOrderResponsePlaceOrderResult PlaceOrderResult
    {
        get
        {
            return this.placeOrderResultField;
        }
        set
        {
            this.placeOrderResultField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk")]
public partial class PlaceOrderResponsePlaceOrderResult
{

    private ErrorDetails errorDetailsField;

    private object idField;

    private object informationalMessagesField;

    private byte statusField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage")]
    public ErrorDetails ErrorDetails
    {
        get
        {
            return this.errorDetailsField;
        }
        set
        {
            this.errorDetailsField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage", IsNullable = true)]
    public object ID
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage")]
    public object InformationalMessages
    {
        get
        {
            return this.informationalMessagesField;
        }
        set
        {
            this.informationalMessagesField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage")]
    public byte Status
    {
        get
        {
            return this.statusField;
        }
        set
        {
            this.statusField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk/WebserviceMessage")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://blah.co.uk/WebserviceMessage", IsNullable = false)]
public partial class ErrorDetails
{

    private ErrorDetail errorDetailField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/Error")]
    public ErrorDetail ErrorDetail
    {
        get
        {
            return this.errorDetailField;
        }
        set
        {
            this.errorDetailField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk/Error")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://blah.co.uk/Error", IsNullable = false)]
public partial class ErrorDetail
{

    private string codeField;

    private string messageField;

    /// <remarks/>
    public string Code
    {
        get
        {
            return this.codeField;
        }
        set
        {
            this.codeField = value;
        }
    }

    /// <remarks/>
    public string Message
    {
        get
        {
            return this.messageField;
        }
        set
        {
            this.messageField = value;
        }
    }
}

答案 3 :(得分:0)

也许缺少引号来完成此行中的url字符串?

[XmlType(AnonymousType = true, Namespace = "http://blah.co.uk)]