我有一个包含大量公共属性的类,其中包含许多浮点值:
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,所以我希望将每个属性的变化保持在最低限度。到目前为止,我只需要更换类型。
答案 0 :(得分:0)
如果您使用基于XmlSerializer
的序列化,那么就有一个小技巧。
将XmlText
属性应用于value属性,如下所示:
[Serializable]
public class ExtFloat
{
[XmlText]
public float Value { get; set; }
private (other information)
}
然后XmlSerializer
会将Value
属性视为类型ExtFloat
的所有序列化属性的节点值。