【问题标题】:How to change attributes, class hierarchy when a class is serialized序列化类时如何更改属性,类层次结构
【发布时间】:2015-03-03 06:45:01
【问题描述】:

我的 SDK (Geometry) 中有一个基类,用于序列化其成员。一些成员只是简单的属性和元素,如字符串,而其他成员是用户定义类的数组。现在,我需要适应我的工作流程中的更改,这会导致基类成为父类的子类,这意味着 XML 层次结构也会发生变化。而且,我还想重命名一些属性/元素。

但是,使用以前的 SDK 代码(类层次结构)序列化的 XML 呢?如何将这些 XML 反序列化到新的 SDK 中?

<Geometry Type"Test" IsAssessed="False">
    <Name>Sample Geometry</Name>
    <LengthA>69</LengthA>
    <LengthB>87</LengthB>
    <LengthC>50</LengthC>
        <Points>
            <Point X="1537308.5" Y="16030594.72" Z="1000">
                <IsTracked>false</IsTracked>
            </Point>
            <Point X="1537308.5" Y="16030594.72" Z="900">
                <IsTracked>false</IsTracked>
            </Point>
            <Point X="1536601.21" Y="16028954.3" Z="-5670.6">
                <IsTracked>false</IsTracked>
            </Point>
        </Points>
</Geometry>

所以,让我们说在进行更改之后,引入了一个名为 Calculator 的类,它有一个 Geometry 集合。但我想重命名几何以及重命名它的一些元素/属性。并添加/删除属性。

我该如何做才能让我之前的 XML 成功反序列化。

【问题讨论】:

    标签: c# xml xml-serialization xmlserializer object-serialization


    【解决方案1】:

    看看Version Tolerant Serialization

    这允许您添加标签(OptionalField、OnDeserializing 等)来说明 XML 结构的变化。

    或者,如果它是一次性的,您可以反序列化到旧版本,然后实施转换代码以更新到新版本。如果这是经常发生的事情,这可能会变得非常难以维护。

    如果您可以选择更改,某些序列化格式在版本控制方面比 XML 提供更大的灵活性,例如,Protocol Buffers

    【讨论】:

    • 如果我反序列化为旧版本然后进行转换,这意味着我将不得不保持原始几何类的原样并用不同的名称复制它并进行从 Original 到反序列化的新功能。对吗?
    • 没错。这就是为什么我说如果它不是一次性的,将很难维持这种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多