21

Serializable将对象保存到磁盘时,哪种文件扩展名最合适?

FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
    fos = new FileOutputStream(filename);
    out = new ObjectOutputStream(fos);
    out.writeObject(mySerializableObject);
} catch (IOException ex) {
    ex.printStackTrace();
} finally {
    IOUtils.closeQuietly(out);
}
4

1 回答 1

39

“.ser”是文件后缀的合理选择 - http://www.file-extensions.org/ser-file-extension

但是,您可能会争辩说,您使用什么后缀几乎没有什么区别……前提是它不会与其他常用的应用程序后缀发生冲突。

Java 序列化对象文件只能由在其类路径上具有相关类的 Java 应用程序读取(以正常方式)。一刀切的“.ser”后缀没有提供关于这些类可能是什么以及应用程序启动框架应该在哪里找到它们的任何线索。因此,您将无法设置 Windows 样式的文件关联来提供双击应用程序启动。


有没有办法可以查看或编辑“.ser”文件?

可能,但难度很大,而且只有在某些条件下。

文件的内容将高度依赖于被序列化的类。现在可以确定该类的名称,以及(在某些情况下)序列化字段的名称和类型。但是,如果该类使用自定义序列化/外部化,则表示将是二进制数据的不透明 blob,文件中没有关于如何解码的线索。不透明 blob 问题相当普遍,因为 Java SE 类库中的许多重要类都使用自定义序列化……为了提高效率……许多应用程序类也是如此。

另一种可能的方法是找到 .ser 文件中提到的所有类的 .class 文件,反序列化为对象,并使用反射来访问反序列化对象的字段。你甚至可以调整它们并重新序列化它们。但是,如果您没有所有 .class 文件的正确版本,那么这将是不可行的。

最后,使用二进制编辑器编辑“.ser”文件在技术上是可行的,但会很危险。序列化格式并非旨在支持这一点。

于 2012-05-03T14:31:42.533 回答