2011-08-24 43 views
5

下面是紧凑框架试图让HTTP服务的代码序列化..不能与XMLSerializer的结果从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(表),而不是typeof(List<Table>),它部分工作..没有错误,但创建的表值为空!

+0

我认为,第二个参数指定序列化的默认命名空间,而不是反序列化。 –

回答

5

XmlSerializer构造函数的第二个参数适用于序列化和反序列化。因此,第二个参数(名称空间)应该与正在接收的参数相同。所以你最终会得到:

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