java 对象序列化与反序列化
序列化和反序列化是什么
当两个进程远程通信时,彼此可以发送各种类型的数据。 无论是何种类型的数据,都 会以二进制序列的形式在网络上传送。比如,我们可以通过 http 协议发送字符串信息;我 们也可以在网络上直接发送 Java 对象。发送方需要把这个 Java 对象转换为字节序列,才能 在网络上传送;接收方则需要把字节序列再恢复为 Java 对象才能正常读取。
把 Java 对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为 Java 对象的 过程称为对象的反序列化。
对象序列化的作用有如下两种:
- 持久化: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
- 网络通信:在网络上传送对象的字节序列。比如:服务器之间的数据通信、对象传递。(消息中间件之间对象的传输)
序列化涉及的类和接口
- ObjectOutputStream 代表对象输出流,它的 writeObject(Object obj)方法可对参数指定的 obj 对象进行序列化,把得到的字节序列写到一个目标输出流中。
- ObjectInputStream 代表对象输入流,它的 readObject()方法从一个源输入流中读取字节 序列,再把它们反序列化为一个对象,并将其返回。
只有实现了 Serializable 接口的类的对象才能被序列化。Serializable 接口是一个空接口, 只起到标记作用。
操作对象
将对象序列化到文件
ObjectOutputStream 可以将一个内存中的 Java 对象通过序列化的方式写入到磁盘的文 件中。被序列化的对象必须要实现 Serializable 序列化接口,否则会抛出异常。
定义实体类对象
package com.io;
import java.io.Serializable;
public class Users implements Serializable {
private int userId;
private String userName;
private String userAge;
public Users() {
}
public Users(int userId, String userName, String userAge) {
this.userId = userId;
this.userName = userName;
this.userAge = userAge;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
}
对象序列化
package com.io;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
/**
* 对象序列化的过程:就是将对象转换成字节
*/
public class ObjectOutputStreamObjectTypeDemo {
public static void main(String[] args) {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("/Users/pain_/Desktop/b/c/b")));
Users user = new Users(1, "kevin", "18");
oos.writeObject(user);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (oos != null) {
oos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
对象反序列化
package com.io;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
/**
* 对象反序列化:字节转对象
*/
public class ObjectInputStreamObjectTypeDemo {
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("/Users/pain_/Desktop/b/c/b")));
Users users = (Users) ois.readObject();
System.out.println("Id:" + users.getUserId() + "\t" + "姓名:" + users.getUserName() + "\t" + "年龄" + users.getUserAge());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ois != null) {
ois.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
悲观者正确,乐观者成功