Java序列化
Java提供了一种对象序列化机制,可以将对象表示为一个字节序列,该字节序列包括对象的数据、对象的类型信息,和对象中数据的类型,将序列化的对象保存在文件中,然后在文件中读取序列,然后反序列化。
类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。
public final void writeObject(Object x) throws IOException
该方法是将对象序列化,然后发送到输出流上
public final Object readObject() throws IOException,ClassNotFoundException
该方法是从输入流上读取数据,并进行反序列化数据为对象
package com.dcits.po;
import java.io.Serializable;
/**
* Created by gm on 2019/12/23.
*/
public class User implements Serializable{
private String username;
private String password;
private String descripty;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDescripty() {
return descripty;
}
public void setDescripty(String descripty) {
this.descripty = descripty;
}
}
如果需要对一个对象进行序列化,只需要实现 Serializable 接口,对于其中一些不需要序列化的字段,可以使用 transient 关键字
package com.dcits.util;
import com.dcits.po.User;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* Created by gm on 2019/12/23.
*/
public class Test {
public static void main(String[] args) {
User user = new User();
user.setUsername("zhangsan");
user.setPassword("123456");
user.setDescripty("这是一个序列化测试程序");
System.out.println("序列化前:");
System.out.println("username:" + user.getUsername());
System.out.println("password:" + user.getPassword());
try {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:/user.txt"));
os.writeObject(user);
os.flush();
os.close();
}catch (Exception e){
e.printStackTrace();
}
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/user.txt"));
User user1 = (User) in.readObject();
System.out.println("反序列化后对象user1:");
System.out.println("username:" + user1.getUsername());
System.out.println("password:" + user1.getPassword());
in.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
运行结果:
com.dcits.util.Test
序列化前:
username:zhangsan
password:123456
反序列化后对象user1:
username:zhangsan
password:123456
Process finished with exit code 0
对于 password 如果不允许序列化,添加 transient 关键字
transient private String password;
运行结果:
com.dcits.util.Test
序列化前:
username:zhangsan
password:123456
反序列化后对象user1:
username:zhangsan
password:null
Process finished with exit code 0
可以看到 password 并未在反序列化时读取到数据。