2012-11-21 68 views
0

我有一个对象,我希望通过WCF服务发送,这需要能够序列化和对象,我可能不知道类型。我发现这对主要类型有效,但是对于引用类型,我无法成功地序列化这些值。在下面的测试中,我会在调试时尝试序列化List或Tuple对象时收到错误消息。有没有一种好的方法来执行这个过程而不知道类型?序列化未知对象到XML

[DataContract] 
public class SizingObject 
{ 
    [DataMember] 
    public List<SizingItem> SizingItems { get; set; } 
} 

[DataContract] 
public class SizingItem 
{ 
    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Value { get; set; } 

    [DataMember] 
    public string Unit { get; set; } 

    [DataMember] 
    public string ListItemId { get; set; } 

    [DataMember] 
    public object Item { get; set; } 
} 

 var i = new SizingObject(); 
     i.SizingItems = new List<SizingItem>(); 
     i.SizingItems.Add(new SizingItem 
           { 
            Item = "String", 
            ListItemId = string.Empty, 
            Name = "string item", 
            Unit = string.Empty, 
            Value = string.Empty 
           }); 

     i.SizingItems.Add(new SizingItem 
           { 
            Item = 0.23, 
            ListItemId = string.Empty, 
            Name = "double item", 
            Unit = string.Empty, 
            Value = string.Empty 
           }); 

     i.SizingItems.Add(new SizingItem 
           { 
            Item = new List<double> { 3, 4, 5, 6 }, 
            ListItemId = string.Empty, 
            Name = "list<double> item", 
            Unit = string.Empty, 
            Value = string.Empty 
           }); 

     i.SizingItems.Add(new SizingItem 
           { 
            Item = new Tuple<string, double>("TupleItem", 2.00), 
            ListItemId = string.Empty, 
            Name = "Tuple<string, double> item", 
            Unit = string.Empty, 
            Value = string.Empty 
           }); 

     // Serialize User Data 
     var stringWriter = new StringWriter(); 
     var serializer1 = new XmlSerializer(typeof(SizingObject)); 
     serializer1.Serialize(stringWriter, i); 
     var xml = stringWriter.ToString(); 

     var serializer2 = new XmlSerializer(typeof(SizingObject)); 
     i = (SizingObject)serializer2.Deserialize(new StringReader(xml)); 

     var dict = new Dictionary<Type, Func<object, object>>(); 
     dict.Add(typeof(string), e => e as string); 
     dict.Add(typeof(double), e => e); 
     dict.Add(typeof(List<double>), e => e as List<double>); 
     dict.Add(typeof(Tuple<string, double>), e => e as Tuple<string, double>); 

     foreach (var item in i.SizingItems) 
     { 
      var result = dict[item.Item.GetType()].Invoke(item.Item); 
     } 

回答

0

我发现我能够解决这个问题时,我花了一点时间,并提供一组已知的类型。我无法序列化Tuple类型,所以不得不创建一个替代品,但是这正如我期望的那样,因为它的类型,列表和其他对象现在可以完全序列化。

var types = new Type[] { typeof(string), typeof(double), typeof(List), typeof(WCFTuple) };

  // Serialize User Data 
      var stringWriter = new StringWriter(); 
      var serializer1 = new XmlSerializer(typeof(SizingObject), types); 
      serializer1.Serialize(stringWriter, i); 
      var xml = stringWriter.ToString(); 

      // Deserialize object. 
      var serializer2 = new XmlSerializer(typeof(SizingObject), types); 
      i = (SizingObject)serializer2.Deserialize(new StringReader(xml)); 

0

没有想过简单地发送它作为一个Object

假设您在两端都有“模板”类的副本,您可以将其作为对象发送,然后在接收端将其转换为该类型。

另一个想法是将其作为XML传输,假设没有真正感性的信息,并在接收端重建该类。

+0

这就是我的目标。我担心的是,由于对象类型未知,对象类型的序列化将失败。当我运行上面的代码时,我可以创建一个列表并成功填充它,以及在另一端检索值。但是,序列化似乎不起作用。我应该不用WCF担心这件事吗? – Spongeali

+0

告诉你实话我还没有在序列化方面取得太大的成功,当然客户不愿花时间让它正常工作,所以我通常会将这些信息作为XML发送到WebService,并让服务进行转换。它的大部分来自VS的预制WebService类结构,但工作。虽然由于臃肿的班级构建笨重,但工程。 – GoldBishop