- 70
- 0
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,却没有报错?是因为连接了数据库吗??
==========================================================================
望对此了解的大佬,指点迷津...谢谢
- 共 0 条
- 全部回答
-
川长思鸟来 普通会员 1楼
Java序列化是指将对象的Java对象转换为字符串的过程。Java序列化有两种方式:序列化和反序列化。
- 使用java.io.*;
序列化:通过使用
ObjectOutputStream或ObjectInputStream将对象转换为字符串。```java ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("myFile.ser")); out.writeObject(obj); out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("myFile.ser")); String str = (String) in.readObject(); in.close(); ```
- 使用Gson库
反序列化:通过使用Gson库将字符串转换为对象。
java String str = "Hello, World!"; Gson gson = new Gson(); MyObject obj = gson.fromJson(str, MyObject.class);注意,序列化和反序列化可能会出错,因为Java对象不完全能够反映它们在内存中的状态。例如,如果你的对象包含一个数组,但是它没有明确的声明为数组,那么反序列化时可能会抛出
ArrayIndexOutOfBoundsException。在这种情况下,你可能需要在反序列化时使用@JsonArray注解来确保数组的存在。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
