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

C# XML反序列化-如何用类替换值属性,同时保持兼容性?,c#,xml-serialization,C#,Xml Serialization,我有一个拥有大量公共属性的类,其中有许多浮点值: public class Foo { ... public float Bar {get; set;} ... } 该类被XML序列化,导致 <Foo ...(Schema stuff)... > ... <Bar>7.34</Bar> ... </Foo> 为了使ExtFloat在已经使用Foo类的数千行代码中表现为一个float,我添加了隐式转

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

public class Foo
{
    ...
    public float Bar {get; set;}
    ...
}
该类被XML序列化,导致

<Foo ...(Schema stuff)... >
    ...
    <Bar>7.34</Bar>
    ...
</Foo>
为了使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>

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


实际上,Foo中有数百个类似Bar的属性,因此我希望将每个属性的更改保持在最低限度。到目前为止,我只需要替换类型。

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

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

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

    private (other information)
}

然后,
XmlSerializer
将把
Value
属性作为
ExtFloat

类型的所有序列化属性的节点值。如果您使用的是基于的序列化,那么有一个小技巧

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

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

    private (other information)
}

然后,
XmlSerializer
属性作为
ExtFloat
类型的所有序列化属性的节点值

您使用的是哪种XML序列化
DataContract
s或“普通的老式”XMLSerializer?您使用的是哪种XML序列化
DataContract
s或“普通的老香草”
XMLSerializer
?谢谢@dymanoid,除了一个小问题,它工作得很好。它变得依赖于区域性,因此我必须将
CultureInfo.InvariantCulture
应用于我自己的转换。然而,由于我的类是通过一个应该具有文化意识的PropertyGrid公开的,因此我必须为网格添加一个单独的属性(使用
[XmlIgnore]
),并将原始属性标记为
[Browsable(false)]
Thank@dymanoid,它工作得很好,除了一个小问题。它变得依赖于区域性,因此我必须将
CultureInfo.InvariantCulture
应用于我自己的转换。但是,由于我的类是通过一个应该具有区域性意识的PropertyGrid公开的,因此我必须为网格添加一个单独的属性(使用
[XmlIgnore]
),并将原始属性标记为
[Browsable(false)]