为了账号安全,请及时绑定邮箱和手机立即绑定

关于java序列化问题

关于java序列化问题

GCT1015 2019-01-18 04:29:46
1.场景描述:最近在看序列化,遇到一些疑惑 //父类 public class parent implements Serializable{ private static final long serialVersionUID = 7604030015683112269L; //UID private String name; //setter/getter... } //子类 public class Child extends parent { //private String attr1;//序列化时注释此行代码,反序列化时取消注解 } //测试类 public class Test{ public static void main(String[] args) throws Exception{ //serializeTest(); //先序列化,添加子类新属性后,注释并反序列化 Child c = deserializeTest(); System.out.println(c.toString()); } /*序列化*/ public static void serializeTest() throws IOException { Child c= new Child(); c.setName("wyy"); ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream(new File("d:/test.txt"))); oos.writeObject(c); System.out.println(c.toString()); System.out.println("序列化success"); } catch (IOException e) { e.printStackTrace(); }finally { oos.close(); } } /*反序列化*/ public static Rich deserializeTest() throws IOException { Child c = null; ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream(new File("d:/test.txt"))); c = (Child) ois.readObject(); System.out.println("反序列化成功"); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally { ois.close(); } return c; } } 2.问题描述: a.父类实现序列化接口 b.子类继承父类 c.先序列化子类对象,子类对象添加新属性后,再反序列化。抛出 InvalidClassException异常,UID不一致.. d.子类添加序列化ID后,反序列化正常执行 (个人理解是序列号类似“暗号”,序列化后,即使类新增了属性“改头换面”,只要“暗号”对上, 就可以正常识别旧的对象数据,反序列化就可以正常执行) 3.疑惑点: 在日常开发中,没有太在意序列化ID。父类实现序列化接口,当子类新增属性后,也没有遇到过上述异常啊。 猜想是因为对象新增属性,对应的数据库也会新增相应字段,所以反序列化时仍能对应上? 但是平时也有用@Transient注解一些暂存字段,数据库没有对应列,也没遇到过InvalidClassException异常(猜想错误...)。 为啥测试用例中,如果没有serialVersionUID,子类添加新属性后再反序列化,会报错,而开发中常增加类的属性,且类中没有serialVersionUID,却没有报错?是因为连接了数据库吗?? ==========================================================================望对此了解的大佬,指点迷津...谢谢
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

不知道楼主有没有试过memcache等缓存来做测试。你的测试方法用的是java的对象序列化,当然对class字节码有严格的判断,在实际开发中,如果场景的是数据库中取出这个实体类,或者保存到数据库,这个过程并不涉及到java的对象序列化,所以可以任意添加字段。但是如果涉及到缓存存储,比如某些memcache的库存储对象就是用java的对象序列化来保存,这个时候就会有序列化、反序列化版本不一致的问题了。所以这个问题还是要看使用场景有没有设计到java的对象序列化。

查看完整回答
反对 回复 2019-02-12
  • 1 回答
  • 0 关注
  • 516 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号