【问题标题】:.net deserialize xml to one of multiple known objects.net 将 xml 反序列化为多个已知对象之一
【发布时间】:2012-09-06 01:26:10
【问题描述】:

尝试使用“.net 反序列化 xml 一种多种已知对象类型”的各种组合进行搜索......但没有找到任何有意义的东西,我现在在这里。

我得到了 5 个不相关对象中的 1 个(每个对象的架构不同),这些对象可能会发送给我,我需要将该 xml 反序列化为正确的对象。当然,对象的数量/类型会增加;-) 有没有办法让反序列化器将 xml 内容匹配到一个对象,也许是反射(只是猜测)?除了 xml 内容本身之外,我没有得到围绕序列化对象的任何外部 xml 包装器告诉我它是什么。这些是来自不同系统的消息,通知我一个事件、状态变化、新订单......

此时我正在考虑蛮力,xml 阅读器寻找与我的已知项目之一唯一匹配的识别属性,然后从那里切换到使用适当的类型进行反序列化。 这似乎不太优雅。

任何指导表示赞赏, G

【问题讨论】:

    标签: .net xml object serialization types


    【解决方案1】:

    使用以下内容:

    Stream xml; // Contains the XML to deserialize
    XmlSerializer xmlSerializer = new XmlSerializer(
        typeof(MyClass1), 
        new []{ typeof(MyClass2), typeof(MyClass3) }); // Add additional classes here
    object obj = xmlSerializer.Deserialize(xml);
    
    if(obj Is MyClass1)
    {
        // Do something
    }
    else if (obj is MyClass2)
    {
        // Do something
    }
    else if (obj is MyClass3)
    {
        // Do something
    }
    // And so on for other classes
    

    【讨论】:

    • 这对我不起作用。传入 XmlSerializer 的构造函数的第一个类型参数应该匹配 xml 的根元素。
    • 我必须纠正自己。仅当序列化器和反序列化器的第一个参数相同时,这才有效。例如,如果第一个参数是 typeof(Message),那么这将导致序列化的 xml 有一个根元素 。如果 xml 在预定义的模式中并且您无法控制它,那么这可能不适合您。
    【解决方案2】:

    如果每种类型的对象的 XML 根元素名称(和/或命名空间)不同,您可以使用 XmlSerializer.CanDeserialize 根据架构检查根元素名称。

    XmlSerializer appleSerializer = new XmlSerializer(typeof(Apple));
    XmlSerializer bananaSerializer = new XmlSerializer(typeof(Banana));
    XmlSerializer carrotSerializer = new XmlSerializer(typeof(Carrot));
    
    XmlReader reader = XmlReader.Create(file);
    
    if (appleSerializer.CanDeserialize(reader))
    {
        Apple a = (Apple)appleSerializer.Deserialize(reader);
        // ...
    }
    else if (bananaSerializer.CanDeserialize(reader))
    {
        Banana b = (Banana)bananaSerializer.Deserialize(reader);
        // ...
    }
    else if (carrotSerializer.CanDeserialize(reader))
    {
        Carrot c = (Carrot)carrotSerializer.Deserialize(reader);
        // ...
    }
    

    【讨论】:

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