【问题标题】:Custom XmlSerialization for nested / child objects嵌套/子对象的自定义 XmlSerialization
【发布时间】:2011-01-13 15:10:20
【问题描述】:

我有一个场景,其中我有一个类 Resource,其中嵌套了两个其他类;操作和资源 URL。我需要为 Resource 和 Action 而不是为 ResourceURL 编写自定义 xmlserializer。我为两者都实现了 IXmlSerializable。

问题是,当 Resource 被序列化时,我调用 Action.WriteXML(XmlWriter) 来获取 Action 的序列化形式,但我无法获取 ResourceURL 的序列化形式。标签变得一团糟,它还添加了一个标签。

那么我如何序列化一个对象,该对象对某些嵌套对象具有客户序列化但对其他对象没有?

【问题讨论】:

    标签: c# ixmlserializable


    【解决方案1】:

    这是一个示例 WriteXml 方法:

        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            // Simple string value:
            writer.WriteAttributeString("Name", this.Name);
    
            // Object without IXmlSerializable implementation:
            writer.WriteStartElement("NonCustomObject");
            new XmlSerializer(NonCustomObjectType).Serialize(writer, this.NonCustomObject);
            writer.WriteEndElement();
    
            // Object with IXmlSerializable implementation:
            writer.WriteStartElement("CustomObject");
            (this.CustomObject as IXmlSerializable).WriteXml(writer);
            writer.WriteEndElement();
        }
    

    下面是对应的ReadXml方法:

        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            // Simple string value
            this.Name = reader.GetAttribute("Name");
    
            // Object without IXmlSerializable implementation here:
            reader.ReadStartElement();
            if (reader.Name == "NonCustomObject")
            {
                reader.ReadStartElement();
                this.NonCustomObject = new XmlSerializer(NonCustomObjectType).Deserialize(reader);
                reader.ReadEndElement();
            }
    
            // Object with IXmlSerializable implementation here:
            reader.ReadStartElement();
            if (reader.Name == "CustomObject")
            {   
                (this.CustomObject as IXmlSerializable).ReadXml(reader);
                reader.ReadEndElement();
            }
        }
    

    【讨论】:

    • Deserialize()object 作为类型返回 - 您需要强制转换以获得正确的类型(这是 C++ 模板和 Java 泛型获胜的地方)。
    • @Guss 怎么会这样?由于 CLR 支持,.NET 泛型大大优于 Java 泛型。 C++ 模板更糟糕,因为它们需要提前编译所有可能的变体。
    • @Mr.TA - (a) 你没有对我指定的问题提出异议,这是 .Net 中一个严重的明显问题; (b) 我不明白 CLR 与它有什么关系——泛型应该在编译期间帮助你,之后没有理由保留信息——它基本上是“安全转换”帮助; (c) 您对 C++ 的断言不正确:C++ 模板仅针对实际使用的类型进行编译。
    • @Guss (a) 你指定的问题甚至不存在;任何反序列化方法都将始终使用反射或类似机制创建类型,而不是使用本机 new 运算符,因此它是否返回 Tobject 是无关紧要的,因为它必须在内部或外部强制转换方法。 (b) CLR 与它有关,因为它提供对泛型类型的本机支持、减少强制转换和装箱/拆箱转换,以及无数其他好处,例如对泛型的反射支持。 (c) 确切地说,所以在具有 15 种类型的 List<> 的程序中,存在膨胀。
    • @Mr.TA:(a) 如果框架根据泛型类型在内部实现转换,这与每个开发人员必须手动正确转换是非常不同的。如果您没有看到平台代码与用户代码的要求不同,那么我们就没有什么可讨论的了。 (b) 您说的唯一有意义的是“反射支持”,如果您设置保留策略,这在 Java 中不是问题。 (c) 你所谓的“膨胀”,C++ 称之为“具有可预测时间复杂度的高效运行时”——对每个人来说都是自己的 ;-)
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2012-12-02
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2011-10-24
    • 2018-02-03
    相关资源
    最近更新 更多