2011-08-24 28 views
5

Đây là mã cố gắng từ khung nhỏ gọn để có được dịch vụ http ..Không thể deserialize với kết quả XMLSerializer từ WCF webservice

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(); 

Nó không thành công với { "Có một lỗi trong tài liệu XML (1, 2). "}

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

Bảng namespace là như nhau ... tôi không biết whats sai có ...

CẬP NHẬT

Vấn đề là tôi đã có typeof (Bảng) không typeof (List<Table>) hoạt động một phần .. Không có lỗi nhưng giá trị bảng được tạo là null!

+0

Tôi tin rằng tham số thứ hai xác định không gian tên mặc định cho serialization, không phải cho deserialization. –

Trả lời

5

Tham số thứ hai trên hàm tạo XmlSerializer hoạt động cho cả tuần tự hóa và deserializing. Vì vậy, trên tham số thứ hai (vùng tên) phải giống với tham số đang được nhận. Vì vậy, bạn sẽ có:

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

Lưu ý "WpfApplication1.Data.Model" ở cuối chuỗi không gian tên.

Một cách để loại bỏ điều không gian tên. Là để chỉ định trên lớp mô hình của bạn (Bảng) rằng nó không nên sử dụng một không gian tên:

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

Bằng cách đó bạn không cần phải xác định không gian tên để deserialization.

Hy vọng điều đó sẽ hữu ích!

0

Thay vì trả lại danh sách, hãy trả về một đối tượng có một thuộc tính duy nhất của danh sách.

4

Không chắc chắn liệu điều này có hữu ích hay không, nhưng chúng tôi đã gặp phải sự cố tương tự. Thay vì trang trí hàng ngàn phần tử dữ liệu với thuộc tính DataContract/DataMember và sử dụng DataContractSerializer (mặc định), chúng tôi thấy rằng nếu dịch vụ WCF của chúng tôi sử dụng XmlSerializerFormat thay vào đó, chúng ta có thể dễ dàng deserialize đối tượng của chúng tôi.

[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); 
} 

Đây là cách chúng ta đang deserializing các đối tượng:

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; 
} 
Các vấn đề liên quan