携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情 >>
问题描述: 在写代码的时候 大家经常会
implements Serializable,本期就来带大家一起来 了解一下implements Serializable到底是为了干些什么事情。
- 先说一下序列化和反序列化
- 把对象转换为字节序列的过程称之为对象的序列化,可以将其保存到磁盘文件中或通过网络发送到任何其他程序。
- 从字节流创建对象的相反过程称为反序列化。
如何实现一个序列化操作?
我们的 JAVA提供了一个 Serializable 接口,同时实现了 Serializable 接口后 IDE会提示我们生成一个serialVersionUID ,那么这个 serialVersionUID 究竟是一个什么的东西呢? 稍后揭晓
-
如何实现序列化与反序列化
- 定义实体类
@Data public class User implements Serializable { private static final long serialVersionUID = -7544045581257242668L; /** *姓名 */ private String name; /** *年龄 */ private Integer age; /** *身高 */ private String hight;- 序列化与反序列操作
public class SerializableDemo { public static void xuliehua(User user) { try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("user11"))); oos.writeObject(user); oos.close(); } catch (IOException e) { e.printStackTrace(); } } public static void fanxuliehua() { try { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("user11"))); User user = (User) ois.readObject(); System.out.println(user); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { User user = new User(); user.setName("张三"); user.setAge(18); // 序列化 xuliehua(user); // 反序列化 fanxuliehua(); } }项目下生成了一个user文件,如图:
打开user文件你会看到:
- serialVersionUID的真正意义
我们先调用序列化方法,然后对serialVersionUID进行注释后,再调用反序列化方法,查看结果:
public static void main(String[] args) {
User user = new User();
user.setName("张三");
user.setAge(18);
// 序列化
xuliehua(user);
// 反序列化
// fanxuliehua();
}
public class User implements Serializable {
// private static final long serialVersionUID = -7544045581257242668L;
private String name;
private Integer age;
public static int height = 11;
public static void main(String[] args) {
User user = new User();
user.setName("张三");
user.setAge(18);
// 序列化
// xuliehua(user);
// 反序列化
fanxuliehua();
}
异常信息,如图:
结论 : 通过异常可以分析,serialVersionUID 作为一个版本号,其实主要目的是为了保持序列化时版本的兼容性,如果我们使用的并非同一个序列号进行序列化与反序列化,操作则会失败。
See you next time...