XML反序列化 - 如何在保持兼容性的同时用类替换值属性?

时间:2016-10-24 13:12:38

标签: c# xml-serialization

我有一个包含大量公共属性的类,其中包含许多浮点值:

public class Foo
{
    ...
    public float Bar {get; set;}
    ...
}

该类是XML序列化的,导致

<Foo ...(Schema stuff)... >
    ...
    <Bar>7.34</Bar>
    ...
</Foo>

在后续版本中,我需要使用一些额外的非序列化信息扩展每个浮点值,因此我创建了一个新类:

public class ExtFloat
{
    public float Value { get; set; }
    private (other information)
}

为了使ExtFloat在已经使用Foo类的数千行代码中表现为float,我添加了隐式转换器:

public static implicit operator float(ExtFloat ef)
{
    return ef.Value;
}

public static implicit operator ExtFloat(float f)
{
    ExtFloat ef = new ExtFloat();
    ef.Value = f;
    return ef;
}

到目前为止一切都那么好,而且无需更改任何引用foo浮点数的代码。但是这个班级现在序列化为

<Foo ...(Schema stuff)... >
    ...
    <Bar>
        <Value>7.34</Value>
    </Bar>
    ...
</Foo>

这使得数百个旧的XML文件不兼容。所以,我的问题是:如何控制XML序列化过程以使现有XML文件中的Bar属性反序列化为新类的Value属性?

实际上有数百个属性,比如Foo中的Bar,所以我希望将每个属性的变化保持在最低限度。到目前为止,我只需要更换类型。

1 个答案:

答案 0 :(得分:0)

如果您使用基于XmlSerializer的序列化,那么就有一个小技巧。

XmlText属性应用于value属性,如下所示:

[Serializable]
public class ExtFloat
{
    [XmlText]
    public float Value { get; set; }

    private (other information)
}

然后XmlSerializer会将Value属性视为类型ExtFloat的所有序列化属性的节点值。