苏州做网站哪家公司好/优帮云排名自动扣费
Java 对象 序列化/反序列化 Serializable和 Externalizable 基本用法
- 概念
- 主要功能场景
- Serializable序列化
- 类实现 Serializable
- 对象 序列化/反序列化
- Externalizable序列化
- 类实现 Externalizable
- 对象 序列化/反序列化
- transient关键字
- 序列化ID serialVersionUID
概念
- 所谓序列化是把 Java对象转换成字节流保存到本地文件
- 反序列化是指从磁盘读取相关字节流转换成 Java对象的过程
主要功能场景
- 持久化到磁盘, 存到数据库等
- 为了网络中传输对象
- 为了进程之间传递对象
Serializable序列化
类实现 Serializable
- Java类只要实现了 java.io.Serializable接口就可以序列化相关对象
public class User implements Serializable {private static final long serialVersionUID = -5142052165948444605L;private Integer age;private String name;public User() {}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"age=" + age +", name='" + name + '\'' +'}';}
}
对象 序列化/反序列化
- ObjectInputStream 从字节流中读取对象
- ObjectOutputStream 对象转换字节流写入
public class App {public static void main(String[] args) {final User user = new User();user.setAge(30);user.setName("Shawn Jeon");try {File file = new File("D:" + File.separator + "User");ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));/** 对象写入到文件*/oos.writeObject(user);ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));/** 从磁盘读取对象*/User user2 = (User) ois.readObject();System.out.println(user2);} catch (Exception e) {e.printStackTrace();}}}# 输出 User{age=30, name='Shawn Jeon'}
Externalizable序列化
类实现 Externalizable
- Java类只要实现了 java.io.Externalizable接口后 @Override相关方法来实现序列化
public class Person implements Externalizable {private static final long serialVersionUID = 7274549675763175797L;private Integer age;private String name;public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeObject(age);out.writeObject(name);}@Overridepublic void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException {this.age = (Integer) oi.readObject();this.name = (String) oi.readObject();}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}
}
对象 序列化/反序列化
public class PersonApp {public static void main(String[] args) {final Person person = new Person();person.setAge(30);person.setName("Shawn Jeon");try {File file = new File("D:" + File.separator + "Person");ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));/** 对象写入到文件*/oos.writeObject(person);ObjectInputStream ois= new ObjectInputStream(new FileInputStream(file));/** 从磁盘读取对象*/Person person2 = (Person) ois.readObject();System.out.println(person2);} catch (Exception e) {e.printStackTrace();}}}# 输出 Person{age=30, name='Shawn Jeon'}
transient关键字
- 对象序列化时可以指定忽略属性
private transient String name;
序列化ID serialVersionUID
- serialVersionUID是指定相关序列化对象版本的, 如果序列化后改动此版本 Java JVM会抛出序列化版本不一致的异常
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!