日期:2014-05-18  浏览次数:21085 次

枚举的序列化与反序列化问题
情况是这样的:
我原来有一个属性是int型的,现在我直接定义一个枚举型,并且直接把这个名称的属性改为这个枚举类型;
问题是原来使用int生成的文件(XmlSerializer序列化类生成的)这个属性是int的值;现在我已经把这个属性的类型改为一个枚举型了,并且原来的int只用几个值(0、1、2、3和-1,所以才考虑改为枚举的),新定义的枚举包括有所有这些int的值可能出现的情况,但是反序列化的时候,旧文件是打不开的,不能进反序列化,应该是这个属性的值(int型)不能转到这个枚举型;同时我做过测试,新的文件(这个属性被改为枚举类型后序列化的文件)他的这个属性的值是枚举的定义值,不会是数值,可以打开。
现在的问题是,我如何兼容打开前面的旧文件,可以考虑使用别的序列化方法。
我在.NET平台下使用C#开发的,不过其他语言有什么解决方案也可以提供参考一下。
谢谢~

------解决方案--------------------
<xml>
<enum>
{a:1,a:1,a:1}
<enum>
<xml>

<xml>
<enum>
<a>1<a>
<a>1<a>
<a>1<a>
<enum>
<xml>
您那种意思
------解决方案--------------------
保留原来的int属性,增加一个与之相应的枚举属性。前者仅供序列化使用,后者用来进行编码。

C# code

private EventType _type;
[XmlIgnore]            // 不要序列化这个属性
public EventType Type
{
  get { return _type; }
  set { _type = value; }
}

[XmlAttribute("Type")]
public int TypeInt
{
  get { return (int)_type; }
  set { _type = (EventType)value; }
}

------解决方案--------------------
1、不会增加额外的内存。虽然是两个属性,但它们共用了一个字段,无非就是多了一组方法,这个问题应该不用担心。
2、的确是个问题,我想到这样一个办法你试试。在反序列化之前,先分析一下数据的版本,如果是早期的版本,就对它进行预处理,把存放枚举值的节点的内容更改为枚举的名称,也就是进行了一次版本的提升,这样就可以按最新的方式进行反序列化。但是这样可能会有很大的体力工作要完成,呵呵。
------解决方案--------------------
原来的文件没有进行版本的标识没有关系啊,可以在新的文件格式里打上版本信息。这样在打开的时候,如果没有版本信息就按老格式来处理。