【问题标题】:Serialize unknown object to xml将未知对象序列化为xml
【发布时间】:2012-11-21 16:04:49
【问题描述】:

我有一个我希望通过 WCF 服务发送的对象,它需要能够序列化和我可能不知道其类型的对象。我看到这适用于原始类型,但是对于引用类型,我无法成功序列化这些值。在下面的测试中,当它尝试序列化 List 或 Tuple 对象时,我在调试时收到一条错误消息。有没有一种在不知道类型的情况下执行此过程的好方法?

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

【问题讨论】:

    标签: xml generics object serialization


    【解决方案1】:

    有没有想过简单地将其作为Object 发送?

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

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

    【讨论】:

    • 这就是我的目标。我担心的是对象类型的序列化会由于对象类型未知而失败。当我运行上面的代码时,我可以创建一个 list 并成功填充它,并在另一端检索值。但是,序列化似乎不起作用。我不应该担心 WCF 的这一点吗?
    • 说实话,我在序列化方面没有取得多大成功,当然客户不愿意花时间让我让它正常工作,所以我通常将信息作为 XML 发送到 WebService并让服务进行转换。它的大部分来自 VS 的预制 WebService 类结构,但可以工作。虽然由于类构建臃肿而笨重,但可以工作。
    【解决方案2】:

    我发现当我花更多时间使用它并提供一组已知类型时,我能够解决这个问题。我无法序列化 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      相关资源
      最近更新 更多