目录
1.对象序列化和反序列化概述
对象序列化是指将对象转换为字节序列的过程
反序列化则是根据字节序列恢复对象的过程
2.序列化一般用于什么场景
- 永久性保存对象,保存对象的字节序列到本地文件中
- 通过序列化对象在网络中传递对象
- 通过序列化在进程间传递对象
3.序列化和反序列化的过程
将任何实现了Serializable接口或Externalizable接口的对象通过ObjectOutputStream类提供的相应方法转换为连续的字节数据,这些数据以后仍可通过ObjectInputStream类提供的相应方法被还原为原来的对象状态,这样就可以将对象完成的保存在本地文件中,或在网络和进程间传递
例子:
①实体类User
package test;
import java.io.Serializable;
public class User implements Serializable{//实现Serializable接口
private Integer id;//用户id
private String name;//用户姓名
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public User() {
}
}
②测试类SerializeTest
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeTest {
public static void main(String[] args) {
File file = new File("D:\\temp2\\a.txt");
try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file));
ObjectInputStream is = new ObjectInputStream(new FileInputStream(file));) {
os.writeObject(new User(1001, "lisi"));// 对象序列化
User user = (User)is.readObject();
System.out.println(user.toString());//User [id=1001, name=lisi]
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.transient关键字
- transient修饰的属性不进行序列化的操作,起到一定消息屏蔽的效果
- 被transient修饰的属性可以正确的创建,但被系统赋为默认值。即int类型为0,String类型为null
例子:
①实体类User
package test;
import java.io.Serializable;
public class User implements Serializable{//实现Serializable接口
private Integer id;//用户id
private transient String name;//用户姓名,不被序列化
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public User() {
}
}
②测试类Serialize
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeTest {
public static void main(String[] args) {
File file = new File("D:\\temp2\\a.txt");
try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file));
ObjectInputStream is = new ObjectInputStream(new FileInputStream(file));) {
os.writeObject(new User(1001, "lisi"));// 对象序列化
User user = (User)is.readObject();
System.out.println(user.toString());//User [id=1001, name=null]
} catch (Exception e) {
e.printStackTrace();
}
}
}