2011-08-24 9 views
5

からのXmlSerializer結果をデシリアライズすることはできませんコードは、httpサービスを取得するために、コンパクトなフレームワークからしようと..ですはここでWCFのWebサービス

List<Table> tables; 
    using (Stream r = response.GetResponseStream()) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Table),"http://schemas.datacontract.org/2004/07/"); 
     tables=(List<Table>) serializer.Deserialize(r); 
    } 

    response.Close(); 

それは{ "XMLドキュメント(1、2)に誤りがありで失敗します。 「}

{"<ArrayOfTable xmlns='http://schemas.datacontract.org/2004/07/WpfApplication1.Data.Model'> was not expected."} 

表の名前空間は同じです...私はいただきましたが間違って知らない ...

UPDATE

問題は、typeof(Table)がtypeof(List<Table>)ではないことです。エラーは発生しませんが、作成されたテーブルの値はnullです!

+0

私は2番目のパラメータはない直列化復元のために、直列化のためのデフォルトの名前空間を指定していることを信じています。 –

答えて

5

XmlSerializerコンストラクタの2番目のパラメータは、シリアル化とデシリアライズの両方で機能します。したがって、2番目のパラメータ(名前空間)は受け取ったものと同じでなければなりません。

XmlSerializer serializer = new XmlSerializer(typeof(Table),"http://schemas.datacontract.org/2004/07/WpfApplication1.Data.Model") 

注名前空間の文字列の末尾に「WpfApplication1.Data.Model」:それで、あなたは持ってしまいます。

名前空間の問題を取り除く1つの方法。

[DataContract(Namespace = "")] 
public class Table { ... } 

あなたは、逆シリアル化のために名前空間を指定する必要はありませんその方法:それは名前空間を使用してはならないことを、あなたのモデルクラス(表)に指定することです。

希望すると助かります!

0

Listを返す代わりに、Listという単一のプロパティを持つオブジェクトを返します。

4

これが役立つかどうかはわかりませんが、同様の問題がありました。 DataContract/DataMember属性を持つ何千ものデータ要素を装飾し、(デフォルトの)DataContractSerializerを使用する代わりに、WCFサービスがXmlSerializerFormatを代わりに使用すると、オブジェクトを簡単に逆シリアル化できます。

[System.ServiceModel.ServiceContract] 
public interface IRestService 
{ 
    [System.ServiceModel.OperationContract] 
    // Added this attribute to use XmlSerializer instead of DataContractSerializer 
    [System.ServiceModel.XmlSerializerFormat(
     Style=System.ServiceModel.OperationFormatStyle.Document)] 
    [System.ServiceModel.Web.WebGet(
     ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Xml, 
     UriTemplate = "xml/objects/{myObjectIdentifier}")] 
    MyObject GetMyObject(int myObjectIdentifier); 
} 

これは、我々は、オブジェクトをデシリアライズしている方法です:

public static T DeserializeTypedObjectFromXmlString<T>(string input) 
{ 
    T result; 

    try 
    { 
     System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T)); 
     using (System.IO.TextReader textReader = new System.IO.StringReader(input)) 
     { 
      result = (T)xs.Deserialize(textReader); 
     } 
    } 
    catch 
    { 
     throw; 
    } 

    return result; 
} 
関連する問題