2012-09-07 75 views
3

我一直在使用Google和原型,没有成功这个想法,并希望检查它是可能的。我有WCF服务器客户端设置。WCF DataContract中的命名空间与Xml反序列化

我有一个datacontracts和datamembers对象。我正在对客户进行海水淡化。该方法也在客户端上。

[Serializable] 
    [DataContract (Namespace = "www.doesnotmatter.com")] 
    [XmlRoot("home")] 
    public partial class BaseModel 
    { 
     [DataMember(IsRequired = false)] 
     public string prop1 
     { get; set; } 

     [DataMember(IsRequired = false)] 
     public string prop2 
     { get; set; } 

     [DataMember(IsRequired=false)] 
     public string prop3 
     { get; set; } 

     } 

我试图从XML反序列化一个对象下面的方法是我的函数

public T FromXmlString<T>() 
{ 
    var reader = new StringReader(xmlConfiguration); 
    var serializer = new XmlSerializer(typeof(T), "www.doesnotmatter.com"); 
    var instance = (T)serializer.Deserialize(reader); 
    reader.Dispose(); 
    return instance; 
} 

XML是

<home> 
     <prop1>aaaaa</prop1> 
     <prop2>bbbbb</prop2> 
     <prop3>cccccc</prop3> 
    </home> 

我不断收到错误

InnerException = {"<Task xmlns=''> was not expected."} 

所以我采取上面的XML,并想要反序列化到上面的BaseModel。 编辑:

基础模型对象坐在服务器上,我在客户端,并有XML我想反序列化到给定的对象(BaseModel)。 我认为这是一个名称空间问题,它无法正确反序列化xml到对象中,但我不确定。

我真的不确定问题是什么,任何人都可以看到它?

+0

您需要提供您要反序列化类的更多细节。这听起来像你试图反序列化到基类型而不是派生类。 P&B – RekrowYnapmoc

+0

您可以发布您试图反序列化的XML吗? – carlosfigueira

+0

xml在上面,我反序列化到类的基类模型 – user101010101

回答

2

更改第二个参数,以您的串行到一个空字符串:

var serializer = new XmlSerializer(typeof(BaseModel), ""); 

本机测试通过:

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Xml.Serialization; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace TestProject1 
{ 
    [TestClass] 
    public class UnitTest1 
    { 
     [TestMethod] 
     public void TestMethod1() 
     { 
      var xml = @" <home> 
     <prop1>aaaaa</prop1> 
     <prop2>bbbbb</prop2> 
     <prop3>cccccc</prop3> 
    </home>"; 

      var reader = new StringReader(xml); 
      var serializer = new XmlSerializer(typeof(BaseModel), ""); 
      var instance = (BaseModel)serializer.Deserialize(reader); 

      Assert.AreEqual("aaaaa", instance.prop1); 
      Assert.AreEqual("bbbbb", instance.prop2); 
      Assert.AreEqual("cccccc", instance.prop3); 
     } 
    } 

    [Serializable] 
    [DataContract(Namespace = "www.doesnotmatter.com")] 
    [XmlRoot("home")] 
    public partial class BaseModel 
    { 
     [DataMember(IsRequired = false)] 
     public string prop1 
     { get; set; } 

     [DataMember(IsRequired = false)] 
     public string prop2 
     { get; set; } 

     [DataMember(IsRequired = false)] 
     public string prop3 
     { get; set; } 
    } 
} 
0

这可能是因为该类已经拥有你是一个XML根未能正确覆盖。很难说因为没有太多的信息。

尝试

var serializer = new XmlSerializer(typeof(T), new XmlRootAttribute("home")); 
+0

谢谢 - 我会尝试这一点,我可以提供任何其他信息,您认为它会有所帮助。 – user101010101

+0

如果您希望将反序列化的对象发送到服务器,那么首先反序列化为中间类(Class X),然后在客户端构建您的WCF对象,然后从自定义对象中分配每个参数你只是反序列化(它是X类的)。 P&B。 – RekrowYnapmoc

+0

为什么这是一个更好的设计,然后直接转到我想发送的对象。 xml包含了我想要填充这个对象并发送它的对象的所有信息,为什么我应该在中间使用另一个对象 - 看起来过于复杂和毫无意义,正如你所说的那样我然后将正确的代码添加到每个可能是非常非常大..? – user101010101

相关问题