Java序列化与反序列化是什么?干什么用的等等这些问题真的困扰了我很久了,总是不理解为什么要序列化,又为什么要反序列化?在什么情况下会用到Java的序列化和反序列化呢?直到今天学习了MapReduce,才深刻的理解了Java序列化和反序列话的作用及什么情况下使用。
Java序列化与反序列化是干什么的?
如果一个对象被序列化之后保存在文件中,可以通过反序列化将对象的类型信息,对象的数据及对象中的数据类型在内存中从新新建。通俗点理解就是,一个对象在一台机器上被序列化保存在文件中,可以在另外一台机器上通过反序列化从新新建这个对象。
使用序列化和反序列化的好处?
- 实现了数据的持久化,通过序列化将数据永久的保存在文件中或数据库中。
- 利用序列化实现远程通信,即在网络上传送对象的字节序列。简单点说,就是发送方把需要发送的对象转换为字节序列,然后在网络上传输。接收方需要从字节序列中恢复出Java对象。
如何实现Java序列化与反序列化呢?
- java.io.ObjectOutputStream:表示对象输出流
- java.io.ObjectInputStream:表示对象输入流
实现序列化的要求?
只有实现了Serializable了接口的类的对象才能被序列化,否则抛出NotSerializableException异常。
案例:
- User类:
public class User implements Serializable {
private String username;
private int age;
public User() {
}
public User(String username, int age) {
this.username = username;
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
}
- 将序列化的对象保存在文件中
@Test
public void out(){
User user = new User("张三",18);
File file = new File("d://out.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(user);
objectOutputStream.flush();
objectOutputStream.close();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
结果:
- 通过反序列化从新生成对象
@Test
public void input(){
File file = new File("d://out.txt");
try {
FileInputStream inputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
User user = (User) objectInputStream.readObject();
System.out.println(user);
objectInputStream.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
结果:
总结:
- Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。
- 采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。
- 继续巩固基础。↖(^ω^)↗!!!