Java:将对象保存在文本文件中?有现成的解决方案吗?
题
我想保存我在程序中生成的对象。重新启动后,应该自动加载数组中的所有对象。我想将它们写在一个文件中,并在重启后解析它们。除手工之外,还有其他更聪明的可能性吗? 谢谢
解决方案
您可以使用 Berkeley DB PersistentMap
类将您的( Serializable
)对象保存在 Map
实现中(缓存)将它们保存到文件中。它使用起来非常简单,意味着你不必担心在哪里保存。
有关序列化的三点注意事项:
- 您将如何应对架构更改(即更改您的类所包含的数据 - 例如添加新字段)
- 如果您的文件损坏会怎样?根据程序存储需要的可靠性将影响您如何保存对象隐式包含的数据的决定。请记住,您始终可以使用关系数据库,例如 MySQL ,然后将此数据转换为您的对象
- 您是否需要能够查看或查询程序 以外的数据?如果你想回答一些简单的问题,例如“有多少个对象有属性X?”,该怎么办?如果您使用(关系型)数据库,则很容易做到;如果你把东西序列化到文件中就不那么容易了! 醇>
其他提示
是的,您正在寻找的概念称为序列化。 Sun有一个很好的教程这里。
这个想法是你想要持久化的类必须实现Serializable接口。之后,使用java.io.ObjectOutputStream.writeObject()将对象写入文件,使用java.io.ObjectInputStream.readObject()将其读回。
您无法序列化所有内容,因为有些内容对序列化没有意义,但您可以解决它们。以下是关于此的引用:
Java的基本机制 序列化很容易使用,但是 还有一些事要知道。如 之前提到的,只有标记的对象 Serializable可以持久化。该 java.lang.Object类没有 实现该接口。因此, 并非Java中的所有对象都可以 自动坚持。好消息 是他们中的大多数 - 像AWT和 Swing GUI组件,字符串和 数组 - 可序列化。
另一方面,确定 系统级类,如Thread, OutputStream及其子类,和 套接字不可序列化。确实, 如果他们没有任何意义 是。例如,运行的线程 我的JVM将使用我的系统 记忆。坚持并努力 在你的JVM中运行它是没有意义的 一点都不另一个重要的一点 java.lang.Object没有实现 任何可序列化的接口 您创建的只扩展的类 对象(没有其他可序列化的 class)除非是可序列化的 你自己实现界面 (与前面的例子一样)。
这种情况存在问题: 如果我们有一个包含的类,该怎么办? 一个Thread的实例?在这种情况下, 我们能不能坚持这一点 类型?答案是肯定的,只要我们 告诉我们的序列化机制 标记我们班级的意图 线程对象为瞬态。
您可能希望查看有效Java以获取有关序列化的一些问题。这些通常是高级的,但如果此功能是您的应用程序的核心部分,您将需要提前了解它们。
示例包括安全问题,继承,以及最重要的是通过实现它来公开“冻结”API的可能性(例如,跨软件版本)。同样,这些都是先进的,本身不应该阻止你。
java.io.Object [输入/输出] Stream是您需要查看的两个类。
您希望持久存档的任何类都需要实现java.io.Serializable接口。
您可能还想考虑使用XML编码,在我看来,它比序列化更具耐久性。使用 java.beans.XMLEncoder / XMLDecoder
类。
我没有使用它,但Google Code最近发布了 protobuf 。
我同意mjlee Google的协议缓冲区是一个比原始序列化方式更好的存储对象的方法。看看你会喜欢它。
我想知道为什么没有人提到 JSON ,例如 Jackson JSON序列化程序。