无法使用WCF Web服务的XMLSerializer结果反序列化

时间:2011-08-24 16:07:08

标签: wcf xml-deserialization

以下是从紧凑框架尝试获取http服务的代码..

    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."}

表命名空间是一样的...... 我不知道那里错了什么......

更新

问题是我的typeof(表)不是typeof(List<Table>),它部分工作..没有错误,但创建的表值为null!

3 个答案:

答案 0 :(得分:5)

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

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

请注意命名空间字符串末尾的“WpfApplication1.Data.Model”。

摆脱名称空间的一种方法。是在模型类(Table)上指定它不应该使用命名空间:

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

这样您就不需要为反序列化指定命名空间。

希望它有所帮助!

答案 1 :(得分:4)

不确定这是否会有所帮助,但我们遇到了类似的问题。我们发现,如果我们的WCF服务使用XmlSerializerFormat,我们可以轻松地反序列化我们的对象,而不是使用DataContract / DataMember属性和使用(默认)DataContractSerializer来装饰数千个数据元素。

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

答案 2 :(得分:0)

而不是返回List返回一个具有List属性的对象。