Serializable是java中提供的序列化的接口。
可以从源码中看到Serializable是一个空接口。一个对象要实现序列化可以直接实现Serializable接口,并声明一个serialVersionUID即可。(可以使用自动生成的或者手动指定如1L)
注意:android studio自动在实体类中生成 serialVersionUID的方法:File -> Settings-> Editor -> Inspections -> Serialization issues -> Serializable class without ‘serialVersionUID’,在实现了了Serializable的类中,选中类名,Alt+Enter弹出提示,导入即可。
下面一个简单的例子说明对象如何进行序列化和反序列化的
1、创建一个类实现Serializable接口
public class User implements Serializable { private static final long serialVersionUID = 6477564458830772334L; private int userId; private String userName; private int age; public User(int userId, String userName, int age) { this.userId = userId; this.userName = userName; this.age = age; } @Override public String toString() { return "User=[userName=" + userName + ",age=" + age + ",userId=" + userId + "]"; } }
2、序列化的过程
User user = new User(1, "test", 20); try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); out.writeObject(user); out.close(); Log.d("====>", "序列化成功:"); } catch (IOException e) { Log.d("====>", "IOException:" + e.toString()); e.printStackTrace(); }
3、反序列化的过程
try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); User user1 = (User) in.readObject(); in.close(); Log.d("====>", "反序列化成功:"+user1.toString()); } catch (IOException e) { e.printStackTrace(); Log.d("====>", "反序列化失败IOException:"+e.toString()); } catch (ClassNotFoundException e) { e.printStackTrace(); Log.d("====>", "反序列化失败ClassNotFoundException:"+e.toString()); }
在使用时我们会发现系统并没有自动去生成serialVersionUID ,如果我们也不为对象指定serialVersionUID,这是对象仍然可以序列化,那么指定serialVersionUID的意义是什么呢?
serialVersionUID 的工作机制:序列化时会把当前对象的serialVersionUID 值写入序列化的文件中,当反序列化时会检测文件中的serialVersionUID 值,看它与当前类是否一致,一致说明可以反序列化,不一致则不能反序列化。
在没有指定serialVersionUID 时如果反序列化之前改变了对象的某些成员变量,那么就会出现反序列化失败的情况,会出现如下的报错:
java.io.InvalidClassException: com.test.demo.User; local class incompatible: stream classdesc serialVersionU
ID = 3597161623298874213, local class serialVersionUID = 1988582645882404281