1.什么是序列化?
序列化(Serialization)是指将对象的状态转换为可以存储或传输的格式的过程。在序列化之后,可以将序列化后的数据保存到文件中,或者通过网络传输到另一个计算机上。反之,将序列化的数据重新转换为对象的过程称为反序列化(Deserialization)。
在Java中,对象序列化是指将一个对象转换为字节流的过程,以便在网络上传输或者保存到文件中。这个过程可以通过Java的序列化机制来实现。通过实现`java.io.Serializable`接口,对象可以被序列化。
序列化的过程可以将对象的状态(成员变量的值)转换为字节序列,然后可以将这些字节序列保存到文件中或通过网络传输。反序列化的过程则是将字节序列重新转换为对象的状态。
序列化主要用于以下几个方面:
1. 数据持久化:可以将对象序列化后保存到文件中,以便在以后重新读取和使用。
2. 网络传输:可以将对象序列化后通过网络传输到另一个计算机上。
3. 进程间通信:在分布式系统中,可以将对象序列化后通过消息队列或其他通信机制在不同的进程之间进行通信。
需要注意的是,序列化不仅仅是将对象的成员变量转换为字节序列,还包括对象的类型信息、类的结构等。在反序列化时,可以根据序列化的字节序列重新构建对象,包括对象的类型和类的结构。
2.如何实现Java序列化?
要实现Java序列化,需要遵循以下步骤:
1. 实现`java.io.Serializable`接口:要使一个Java类可序列化,需要让该类实现`java.io.Serializable`接口。这是一个标记接口,不包含任何方法,只是用来标识该类的实例可以被序列化。
```java
import java.io.Serializable;
public class MyClass implements Serializable {
// 类的定义
}
```
2. 对需要序列化的类进行标记:在需要进行序列化的类上实现`Serializable`接口,这样该类的实例对象就可以被序列化。
3. 使用对象输出流进行序列化:使用`ObjectOutputStream`类将对象序列化为字节流,并将字节流写入文件或通过网络传输。
```java
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerializationExample {
public static void main(String[] args) {
MyClass obj = new MyClass();
try (FileOutputStream fileOut = new FileOutputStream("object.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
上述代码中,`MyClass`对象`obj`被序列化为字节流,并写入到名为`object.ser`的文件中。
通过上述步骤,就可以实现Java对象的序列化。当需要反序列化时,可以使用`ObjectInputStream`类来读取字节流并将其转换为对象。
需要注意的是,实现序列化的类的所有成员变量都应该是可序列化的,或者使用`transient`关键字标记不需要序列化的成员变量。否则,在序列化时会抛出`NotSerializableException`异常。
3.Java 序列话中,如果有些字段不想进行序列化怎么办?
如果在Java中有一些字段不想进行序列化,可以使用`transient`关键字来标记这些字段。被`transient`修饰的字段不会被序列化,即在序列化过程中,这些字段的数值不会被保存到字节流中。
下面是一个示例:
```java
import java.io.Serializable;
public class MyClass implements Serializable {
private String name;
private transient int age; // age字段不会被序列化
// 其余代码
}
```
在上面的示例中,`age`字段被标记为`transient`,因此在序列化`MyClass`对象时,`age`字段的值不会被保存到字节流中。当对象被反序列化时,`age`字段的值会被初始化为默认值(例如0)。
通过使用`transient`关键字,可以控制哪些字段需要被序列化,哪些字段不需要被序列化。
4.编程题:按照以下要求复制文件,练习基本输入输入流的使用:
1)普通字节输入输出流,按照每次读一个字节进行复制字节文件
2)普通字节输入输出流,按照每次读一个字节数组进行复制字节文件
3)缓冲字节输入输出流,按照每次读一个字节进行复制字节文件
4)缓冲字节输入输出流,按照每次读取一个字节数组进行复制字节文件
5)普通字符输入输出流,按照每次读一个字符进行复制字符文件
6)普通字符输入输出流,按照每次读一个字符数组进行复制字符文件
7)简化字符输入输出流,按照每次读一个字符进行复制字符文件
8)简化字符输入输出流,按照每次读一个字符数组进行复制字符文件
9)缓冲字符输入输出流,按照每次读一个字符进行复制字符文件
10)缓冲字符输入输出流,按照每次读取一个字符数组进行复制字符文件
11)缓冲字符输入输出流,按照每次读取一行进行复制字符文件