Java Serializable
一、Serializable
要序列化对象需要实现 Serializable 接口
// lombok 插件,省去 get,set 方法,构造器方法 @Data @AllArgsConstructor public class Person implements Serializable { private static final long serialVersionUID = -4091636180504737862L; private String name; private int age; private String sex; }
序列化与反序列化方法
public static void main(String[] args) throws Exception { Person person = new Person("zahngsan", 18, "man"); Serialize(person, "D:/Person.txt"); Person p = Deserialize(person, "D:/Person.txt"); System.out.println(MessageFormat.format("name={0},age={1},sex={2}", p.getName(), p.getAge(), p.getSex())); } /** * 序列化 */ private static void Serialize(Object object, String path) throws IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(path))); oos.writeObject(object); oos.close(); } /** * 反序列 */ private static <T> T Deserialize(T t, String path) throws Exception, IOException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(path))); T object = (T) ois.readObject(); ois.close(); return object; }
二、Externalizable
与 Serializable 相比,Externalizable 更为灵活,可自己选择要序列化那些字段。
Externalizable 继承自 Serializable。序列化对象实现 Externalizable 接口时,还需重写 writeExternal 和 readExternal 方法,并必须有空参构造器。
// lombok 插件,省去 get,set 方法,构造器方法 @Data @AllArgsConstructor @NoArgsConstructor // 空参构造器 public class Person implements Externalizable { private static final long serialVersionUID = -4091636180504737862L; private String name; private int age; private String sex; @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(name); out.writeInt(age); out.writeObject(sex); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { name = (String) in.readObject(); age = in.readInt(); sex = (String) in.readObject(); } }
序列化与反序列化与上面一样
三、serialVersionUID
阿里规范说明
IDEA 自动生成 UID,Inspections -> serialVersionUID
四、transient
1、序列化之后保存的是类的信息(状态),被声明为 static 的属性不会被序列化,static 修饰的变量是属于类的而不是属于对象
2、被声明为 transient 的属性不会被序列化,这就是 transient 关键字的作用
3、transient 修饰,对实现 Externalizable 并指定序列化属性的无效。序列化时会先调用对象里的 writeObject 和 readObject 方法。
若没有这样的方法,那么默认调用的是 ObjectOutputStream 的 defaultWriteObject 以及 ObjectInputStream 的 defaultReadObject 方法。
http://www.importnew.com/17964.html