什么是Serializable序列化接口
序列化接口是一个空实现
是java.io包定义的用于实现序列化的语义级别的接口,这个接口是用来通知jvm让其帮助做类的序列化
实现了Serializable接口可以序列化,通过ObjectOuputStream转换为字节流,保存到文件中;然后可以反序列化,通过ObjectInputStream转换为java对象
序列化的作用
无论什么变成语言,底层都是操作系统通过字节流的方式实现的,写操作可以把编程语言的数据类型转换为字节流,读操作可以把字节流转换为编程语言的数据类型
可以把对象的状态信息通过网络进行传输,或者把对象的信息持久化
为什么要定义SerializableUID变量
表达的意思是:没有显示声明serializableUID,系统会默认生成一个,但建议显示声明serializableUID,因为系统默认生成的对class及其敏感,在反序列化过程中容易抛出异常,建议用private修饰,其不适用于子类
序列化和反序列化的实现
User
package com.cjy.bean;
import java.io.Serializable;
import java.sql.Date;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public User() {
}
public User(Integer id, String username, Date birthday, String sex, String address) {
this.id = id;
this.username = username;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
SerializableTestWriteFile
import com.cjy.bean.User;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class SerializableTestWriteFile {
/**
* 将User对象作为文本写入磁盘
*/
public static void writeObj() throws ParseException {
User user = new User(2,"cjy",new Date(new SimpleDateFormat("yyyy-MM-dd").parse("1234-12-12").getTime()),"男","随州市");
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("E:/user.txt"));
objectOutputStream.writeObject(user);
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws ParseException {
writeObj();
}
}
SerializableTestReadFile
import com.cjy.bean.User;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class SerializableTestReadFile {
/**
* 将类从文本中提取并赋值给内存中的类
*/
public static void readObj() {
try {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("E:/user.txt"));
try {
Object object = objectInputStream.readObject();
User user = (User) object;
System.out.println(user);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
readObj();
}
}