Почему мой SOAP XML-ответ не десериализуется в C #? - PullRequest
1 голос
/ 28 марта 2012

Мой вызов службы мыла возвращает следующий ответ:

<AssetList xmlns="http://schemas.datacontract.org/2004/07/XOSDigital.Assets" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Facets xmlns:a="http://schemas.datacontract.org/2004/07/XOSDigital.Business_Classes.Search"/>
  <Results/>
  <err i:nil="true"/>
  <offset>0</offset>
  <total>0</total>
</AssetList>

Когда я пытаюсь сериализовать это через:

        AssetList assets;
        var serializer = new XmlSerializer(typeof(AssetList));
        assets = (AssetList)serializer.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(response.Content)));

Я получаю следующее исключение:

<AssetList xmlns='http://schemas.datacontract.org/2004/07/XOSDigital.Assets'> was not expected.

Объект AssetList, который я пытаюсь десериализовать, был автоматически сгенерирован путем обновления моей ссылки на службу относительно той же самой службы, которую я вызываю с моим GET-запросом.

Почему это терпит неудачу?

Класс AssetList генерируется как:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="AssetList", Namespace="http://schemas.datacontract.org/2004/07/XOSDigital.Assets")]
[System.SerializableAttribute()]
public partial class AssetList : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {

    [System.NonSerializedAttribute()]
    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private XOSDigital.XOSSuperfanAdminList.XosAssetWebService.AvailableFacetGroup[] FacetsField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private XOSDigital.XOSSuperfanAdminList.XosAssetWebService.Asset[] ResultsField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private string errField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private int offsetField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private int totalField;

    [global::System.ComponentModel.BrowsableAttribute(false)]
    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
        get {
            return this.extensionDataField;
        }
        set {
            this.extensionDataField = value;
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute()]
    public XOSDigital.XOSSuperfanAdminList.XosAssetWebService.AvailableFacetGroup[] Facets {
        get {
            return this.FacetsField;
        }
        set {
            if ((object.ReferenceEquals(this.FacetsField, value) != true)) {
                this.FacetsField = value;
                this.RaisePropertyChanged("Facets");
            }
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute()]
    public XOSDigital.XOSSuperfanAdminList.XosAssetWebService.Asset[] Results {
        get {
            return this.ResultsField;
        }
        set {
            if ((object.ReferenceEquals(this.ResultsField, value) != true)) {
                this.ResultsField = value;
                this.RaisePropertyChanged("Results");
            }
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string err {
        get {
            return this.errField;
        }
        set {
            if ((object.ReferenceEquals(this.errField, value) != true)) {
                this.errField = value;
                this.RaisePropertyChanged("err");
            }
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute()]
    public int offset {
        get {
            return this.offsetField;
        }
        set {
            if ((this.offsetField.Equals(value) != true)) {
                this.offsetField = value;
                this.RaisePropertyChanged("offset");
            }
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute()]
    public int total {
        get {
            return this.totalField;
        }
        set {
            if ((this.totalField.Equals(value) != true)) {
                this.totalField = value;
                this.RaisePropertyChanged("total");
            }
        }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Я думаю, что проблема связана с пространствами имен.

Можете ли вы попробовать это?

var serializer = new XmlSerializer(typeof(AssetList),"http://schemas.datacontract.org/2004/07/XOSDigital.Assets");
0 голосов
/ 28 марта 2012

Попробуйте добавить это в качестве первой строки в вашем xml:

<?xml version="1.0"?>

Кроме того, добавьте атрибут XmlRoot с пространством имен в ваш AssetList класс:

[XmlRoot("AssetList", Namespace = "http://schemas.datacontract.org/2004/07/XOSDigital.Assets")] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...