Java 对象流的高级应用
发布时间: 2024-02-25 20:24:38 阅读量: 18 订阅数: 19
# 1. Java 对象流的基础知识
1.1 什么是对象流?
对象流是Java中用于读取和写入对象的流。与普通的字节流或字符流不同,对象流可以直接将对象以二进制的形式写入到流中,也可以从流中读取出对象并进行反序列化。
1.2 对象流与其他流的区别
对象流与其他流的最大区别在于对象流可以直接读写Java对象,而不需要将对象转换为字节或字符数组。对象流的使用可以极大简化对象的存储和传输过程。
1.3 对象流的基本用法
```java
import java.io.*;
public class ObjectStreamExample {
public static void main(String[] args) {
// 对象序列化
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.txt"));
out.writeObject(new Person("Alice", 25));
out.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对象反序列化
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.txt"));
Person person = (Person) in.readObject();
in.close();
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
```
**代码总结:**
- 通过ObjectOutputStream可以将对象序列化到文件中。
- 通过ObjectInputStream可以从文件中反序列化对象。
- 要进行对象的序列化和反序列化,对象类需要实现Serializable接口。
**结果说明:**
运行以上代码,将会在当前目录下生成一个名为"object.txt"的文件,文件中存储了序列化后的Person对象。在反序列化后,将会输出该对象的信息。
# 2. 对象序列化与反序列化
对象序列化是指将对象转换为字节序列的过程,而对象的反序列化则是将字节序列转换回对象的过程。对象序列化与反序列化在Java中是通过对象流来实现的。
#### 2.1 什么是对象序列化?
对象序列化是指将对象转换为字节序列的过程,可以将对象保存到磁盘上,或者通过网络传输到远程主机。对象序列化后的字节序列可以被重新组装成对象,从而实现数据的持久化和远程通信。
#### 2.2 如何实现对象的序列化和反序列化?
在Java中,要使一个类支持序列化,需要让该类实现 Serializable 接口,该接口没有任何方法,只是一个标识接口,表示该类可以被序列化。同时,需要注意的是类的所有成员变量都必须是可序列化的,否则需要标记为 transient,表示该成员变量不参与序列化。
以下是一个简单的示例:
```java
import java.io.*;
// 定义一个可序列化的Person类
class Person implements Serializable {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializationExample {
public static void main(String[] args) {
// 对象序列化
try {
Person person = new Person("Alice", 25);
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
System.out.println("对象已序列化到文件 person.ser");
} catch (IOException e) {
e.printStackTrace();
}
// 对象反序列化
try {
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person person = (Person) in.readObject();
in.close();
fileIn.close();
System.out.println("从文件 person.ser 反序列化得到对象:" + person.name + " " + person.age);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
```
#### 2.3 序列化版本号的作用
在序列化对象时,Java会自动计算一个序列化版本号(serialVersionUID),用来确保序列化和反序列化的兼容性
0
0