如何在文本编辑器中读取Java ObjectOutputStream生成的序列化文件?
为什么ObjectOutputStream生成的文件在文本编辑器里不可读?怎么解决?
嘿,这个问题其实挺常见的——先给你把本质说清楚:ObjectOutputStream写出的是Java专用的二进制序列化数据,它的设计目标是让Java程序能高效还原对象,而不是生成人类可读的文本内容。所以你用文本编辑器打开看到一堆乱码/十六进制字符,完全是正常现象,不是你代码写错了。
那如果想在文本编辑器里查看文件内容,有这几个可行的办法:
1. 改用可读的序列化格式(推荐)
放弃Java原生的二进制序列化,把对象转换成JSON、XML这类通用的可读格式。比如用Gson或者Jackson库来实现,举个Gson的例子:
import com.google.gson.Gson; import java.io.FileWriter; import java.io.IOException; public class Employee { public String name; public void mailCheck() { System.out.println("Mailing a check to " + name); } } public class JsonSerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; Gson gson = new Gson(); String json = gson.toJson(e); try (FileWriter writer = new FileWriter("C:/Users/123/Documents/record.json")) { writer.write(json); System.out.printf("Serialized data (JSON) is saved."); } catch (IOException i) { i.printStackTrace(); } } }
这样生成的record.json文件用文本编辑器打开就是清晰的JSON内容:{"name":"Reyan Ali"},完全可读。
2. 写一个小工具解析二进制序列化文件
如果必须保留Java原生序列化的文件,你可以写一个简单的工具类,读取序列化文件后把对象的属性输出成可读文本,甚至写入到一个文本文件里:
import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.FileWriter; public class SerializedFileReader { public static void main(String[] args) { try (FileInputStream fileIn = new FileInputStream("C:/Users/123/Documents/record.ser"); ObjectInputStream in = new ObjectInputStream(fileIn)) { Employee e = (Employee) in.readObject(); // 直接打印到控制台,或者写入文本文件 System.out.println("Employee name: " + e.name); // 写入到文本文件的示例 try (FileWriter writer = new FileWriter("C:/Users/123/Documents/record.txt")) { writer.write("Employee name: " + e.name); } } catch (IOException | ClassNotFoundException i) { i.printStackTrace(); } } }
运行这个程序后,record.txt就是你能在文本编辑器里直接查看的内容了。
3. 使用专门的Java序列化查看工具
有些工具可以直接解析Java二进制序列化文件并展示可读内容:
- IDE插件:比如IntelliJ IDEA的Serializable Inspector插件,安装后可以直接打开
.ser文件查看对象的属性和值。 - 第三方命令行工具:比如
SerializationDumper,可以把序列化的二进制数据解析成结构化的文本输出。
总结一下:Java原生序列化本来就不是给人读的,所以要么换成可读格式,要么写工具解析,要么用专用工具查看。你的代码本身是没问题的,只是误解了序列化文件的用途~
内容的提问来源于stack exchange,提问作者DevNadim
相关产品推荐
相关产品推荐

