以下是从紧凑框架尝试获取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!
答案 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属性的对象。