序列化:
所谓的对象序列化指的是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或者是网络传输,
对象序列化是一个重要的概念,但是在开发之中对象序列化并不麻烦,因为序列化的时候用户只需要标注可序列化的对象,然后系统会帮助用户进行序列化;
但是并不是所有的对象都可以被序列化,在java中有一个强制的要求:
如果要序列化的类,都必须实现 java.io.Serializable父接口,作为序列化的标记。
Serializable接口中没有任何方法,因为它描述的是一种类的能力,在java中有两个描述类能力的接口,一个是Serializable,一个是cloneable。
可以被序列化的类:
import java.io.Serializable;
@SuppressWarnings("serial")
class Person implements Serializable{ // Serializable接口中没有任何方法,其作用是描述类的能力,和克隆接口一样
// 此时 Person类可以被序列化
// private static final long serialVersionUID = 1L; // 为了防止反序列化,一般会加上一个序列号,但是意义不大,因为可以选择@SuppressWarnings("serial")压制
private String name;
int age;
public Person(String name,int age){
this.age = age;
this.name = name;
}
}
此时Person类产生的每一个对象都可以被序列化,实现二进制的数据传输。
序列化和反序列化:
类名称: | 序列化:ObjectOutputStream(JDK 1.1) | 反序列化:ObjectInputStream(JDK 1.1) |
类定义: |
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
|
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
|
类名称: | 序列化:ObjectOutputStream(JDK 1.1) | 反序列化:ObjectInputStream(JDK 1.1) |
构造方法: |
public ObjectInputStream(InputStream in) throws IOException
|
protected ObjectOutputStream() throws IOException,SecurityException
|
操作方法: |
public final void writeObject(Object obj) throws IOException
|
public final Object readObject() throws IOException, ClassNotFoundException
|
代码实现:
import java.io.*;
@SuppressWarnings("serial")
class Person implements Serializable{ // Serializable接口中没有任何方法,其作用是描述类的能力,和克隆接口一样
// 此时 Person类可以被序列化
// private static final long serialVersionUID = 1L; // 为了防止反序列化,一般会加上一个序列号,但是意义不大,因为可以选择@SuppressWarnings("serial")压制
private String name;
int age;
public Person(String name,int age){
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class MAIN {
private static final File SAVE_FILE = new File("D:" + File.separator + "CDLM.Person");
public static void main(String[] args) throws Exception{
saveObject(new Person("张三",18));
System.out.println(loadObject());
}
public static void saveObject(Object obj) throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
oos.writeObject(obj); // 序列化
oos.close();
}
public static Object loadObject() throws Exception{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SAVE_FILE));
Object obj = ois.readObject(); // 反序列化
ois.close();
return obj;
}
}
在java中的对象序列化与反序列化必须使用内部提供的对象操作流,因为这里面牵扯到二进制的格式,所以不能够自定义处理,另外如果想实现一组对象的序列化,则可以使用对象数组完成。
在很多的实际开发项目中,开发者很少能够见到ObjectOutputStream和ObjectInputStream的直接操作,因为会有一些程序类(容器)帮助开发者自动实现。
protected |
ObjectInputStream() |
---|
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 上周热点回顾(2.17-2.23)