Java序列化API的使用
程序员文章站
2024-02-26 21:36:46
...
Java对象序列化
为什么需要序列化呢?详情可以看一下这篇博客
https://blog.csdn.net/liu16659/article/details/85793686
Java序列化API为处理对象序列化提供了一个标准机制,具体的Java序列化需要注意以下事项
-
类要实现序列化功能,只需要 实现java.io.Serializable接口即可
-
序列化和反序列化必须保持序列化的ID一致,一般使用
private static final long serializableId
定义序列化的ID
-
序列化并不保存静态变量
-
在序列化父类变量时,父类也需要实现Serializable接口
-
使用transient关键字可以防止该变量被序列化,再被反序列化之后,transient变量的值被设定为对应类型的初始值,例如,int类型的变量的值是0,对象类型的变量会是null。
package com.oracle.serializable;
import java.io.*;
/**
* @author zhouyanxiang
* @create 2020-08-2020/8/17-18:29
* 序列化之后乱码是正常的,因为序列化和反序列话是基于二进制流的,序列话便是把java对象的信息以二进制存储在文件obj.bat中,用文本编辑器打开自然是乱码。
* 只有通过反序列话才能将存储的二进制读取出来,然后显示在控制台上。
*/
public class SerializableReview {
static class Worker implements Serializable {
// 自定义序列化的ID
private static final long serializableId = 123456789L;
// 将要被序列化的属性name
private String name;
// transient修饰的变量不会被序列化
private transient int salary;
// 静态变量属于类信息,不属于对象的状态,因此不会被序列化
static int age = 23;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 序列化到磁盘
FileOutputStream fos = new FileOutputStream("work.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Worker worker = new Worker();
worker.setName("alex");
oos.writeObject(worker);
oos.flush();
oos.close();
// 反序列化磁盘数据并解析磁盘数据
FileInputStream fis = new FileInputStream("work.out");
ObjectInputStream ois = new ObjectInputStream(fis);
Worker workerTest = (Worker) ois.readObject();
System.out.println(workerTest.getName());
}
}
直接打开文件将会是乱码的
只有通过反序列化才能读出对象的信息
Java序列化API为处理对象序列化提供了一个标准机制,具体的Java序列化需要注意以下事项
-
类要实现序列化功能,只需要 实现java.io.Serializable接口即可
-
序列化和反序列化必须保持序列化的ID一致,一般使用
private static final long serializableId
定义序列化的ID
-
序列化并不保存静态变量
-
在序列化父类变量时,父类也需要实现Serializable接口
-
使用transient关键字可以防止该变量被序列化,再被反序列化之后,transient变量的值被设定为对应类型的初始值,例如,int类型的变量的值是0,对象类型的变量会是null。
package com.oracle.serializable;
import java.io.*;
/**
* @author zhouyanxiang
* @create 2020-08-2020/8/17-18:29
* 序列化之后乱码是正常的,因为序列化和反序列话是基于二进制流的,序列话便是把java对象的信息以二进制存储在文件obj.bat中,用文本编辑器打开自然是乱码。
* 只有通过反序列话才能将存储的二进制读取出来,然后显示在控制台上。
*/
public class SerializableReview {
static class Worker implements Serializable {
// 自定义序列化的ID
private static final long serializableId = 123456789L;
// 将要被序列化的属性name
private String name;
// transient修饰的变量不会被序列化
private transient int salary;
// 静态变量属于类信息,不属于对象的状态,因此不会被序列化
static int age = 23;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 序列化到磁盘
FileOutputStream fos = new FileOutputStream("work.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Worker worker = new Worker();
worker.setName("alex");
oos.writeObject(worker);
oos.flush();
oos.close();
// 反序列化磁盘数据并解析磁盘数据
FileInputStream fis = new FileInputStream("work.out");
ObjectInputStream ois = new ObjectInputStream(fis);
Worker workerTest = (Worker) ois.readObject();
System.out.println(workerTest.getName());
}
}
直接打开文件将会是乱码的
只有通过反序列化才能读出对象的信息
上一篇: Java 序列化流的使用