目录
问题:
刷完经,以写博客的形式输出,特此记录。
定义:
序列化:将对象转换成字节的形式,存储到文件中,方便在网络中传输。
反序列化:将字节还原成字节的形式。
实践:
package serializabel;
import java.io.Serializable;
//序列化必须实现该接口
public class Person implements Serializable {
//序列化版本号
//反序列化的时候,编译器会自动检测,对照序列化版本号
//不相同,则会报错
public static final long serialVersionID=1L;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Person{name = " + name + ", age = " + age + "}";
}
}
//序列化
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person); // 将对象序列化并写入文件
System.out.println("对象已序列化到文件: person.ser");
} catch (Exception e) {
e.printStackTrace();
}
}
}
//反序列化
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserializationExample {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Person person = (Person) in.readObject(); // 从文件中反序列化对象
System.out.println("对象已反序列化: " + person);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意实现:
1.静态字段属于类的级别,不会被序列化,我们序列化的都是实例化后的对象。
2.父类如果没有继承Serializable接口,子类的对象可以被序列化,但是父类的不会,需要手动进行序列化。
补充知识:
io输入流中的高级层和低级层
可以拿这样一个比喻来理解:
低级层像一个水管,而高级层像一个过滤的网,高级层可以对水流进行过滤、压缩、加密或其他处理。
常见的底层流
- 用于与外部的通信。
- 只能以字节或字的方式处理。
类名 | 作用 |
---|---|
| 从文件中读取字节数据。 |
| 向文件中写入字节数据。 |
| 从内存中的字节数组读取数据。 |
| 将数据写入内存中的字节数组。 |
| 从管道中读取数据(通常用于线程间通信)。 |
| 向管道中写入数据(通常用于线程间通信)。 |
| 从网络连接中读取字节数据。 |
| 向网络连接中写入字节数据。 |
常见的高层流:
- 必须依赖底层流,不可以单独使用。
- 拥有处理复杂数据的能力。
类名 | 作用 |
---|---|
对象操作 | |
| 从底层流中读取并反序列化对象。 |
| 将对象序列化为字节流并通过底层流写入。 |
数据格式化 | |
| 从底层流中读取基本数据类型(如 |
| 将基本数据类型写入底层流。 |
缓冲 | |
| 为底层流提供缓冲功能,提高读取效率。 |
| 为底层流提供缓冲功能,提高写入效率。 |
压缩/解压 | |
| 从底层流中读取并解压缩数据。 |
| 将数据压缩后写入底层流。 |
| 从底层流中读取并解压缩 ZIP 格式的数据。 |
| 将数据压缩为 ZIP 格式并写入底层流。 |
加密/解密 | |
| 从底层流中读取并解密数据。 |
| 将数据加密后写入底层流。 |
字符编码转换 | |
| 将字节流转换为字符流(指定字符集)。 |
| 将字符流转换为字节流(指定字符集)。 |