一种解决java fst序列化兼容性问题的方法
有时因为疏忽,后面对类增加了属性,或删除属性,导致旧的数据无法反序列化。
如何解决?这是一种解决java fst序列化兼容性问题的方法。
如图:User 类
package test;import lombok.Data;import java.io.Serializable;@Data
public class User implements Serializable {private String name;private Integer age;
}
对象序列化后,数据格式如下:
如果某种原因,添加了新到属性,忘记了加@Version(1) 版本号,如下:
package test;import lombok.Data;import java.io.Serializable;@Data
public class User implements Serializable {private String name;private Integer age;private Integer height;
}
旧的数据反序列化就会异常,如何解决?
首先序列化数据是按一定规则存放的,@Version高的在后面,Integer、Long、String等属性会按一定规则排序存放。一般先存放长度,然后是数据。
这里有个技巧:
(1)可创建一个新的类,类名长度和原来一样。如:Use2
package test;import lombok.Data;import java.io.Serializable;@Data
public class Use2 implements Serializable {private String name;private Integer age;
}
(2)把序列化到数据转成HexString,记作oldHex
(3)"User "也转成byte[]再换成HexString,,记作hex1
(4)"Use2 "也转成byte[]再换成HexString.,记作hex2
(5)newHex=oldHex.replace(hex1,hex2)
(6)对newHex转为byte[],然后反序列化,就得到Use2 类数据。通过字段赋值(或别的方式),就可以得到User类的数据。