提问人:wellenreiter 提问时间:10/4/2008 最后编辑:Jonaswellenreiter 更新时间:12/14/2012 访问量:9472
Java:将对象保存在文本文件中?有现成的解决方案吗?
Java: Save objects in a textfile? Are there readymade solutions?
问:
我想在程序中保存我生成的对象。重新启动后,应用程序应自动加载数组中的所有对象。我想将它们写在一个文件中并在重新启动后解析它们。还有其他比手工做更聪明的可能性吗? 谢谢
答:
是的,你要找的概念叫做序列化。Sun 有一个很好的教程。
这个想法是,要保留的类必须实现 Serializable 接口。之后,使用 java.io.ObjectOutputStream.writeObject() 将对象写入文件,并使用 java.io.ObjectInputStream.readObject() 将其读回。
你不能序列化所有的东西,因为有些东西序列化是没有意义的,但你可以解决它们。以下是关于这一点的引述:
Java 的基本机制 序列化使用简单,但 还有一些事情要知道。如 前面提到过,只有标明的对象 可以持久化可序列化。这 java.lang.Object 类不这样做 实现该接口。因此 不是 Java 中的所有对象都可以 自动保留。好消息 是他们中的大多数——比如 AWT 和 Swing GUI 组件、字符串和 数组 -- 是可序列化的。
另一方面,某些 系统级类,如 Thread、 OutputStream 及其子类,以及 套接字不可序列化。事实上 如果他们 是。例如,线程在 我的 JVM 将使用我的系统的 记忆。坚持下去并尝试 在你的JVM中运行它是没有意义的 完全。另一个重要的点 java.lang.Object 未实现 可序列化的接口是任何 您创建的仅扩展的类 对象(没有其他可序列化的对象 classes) 不可序列化,除非 您自己实现接口 (如上例所示)。
这种情况带来了一个问题: 如果我们有一个包含 线程的实例?在这种情况下, 我们能持久化这样的对象吗? 类型?答案是肯定的,只要我们 告诉序列化机制我们的 通过标记我们班级的意图 线程对象作为瞬态对象。
您可能想查看 Effective Java 以了解与序列化相关的一些问题。这些通常是高级的,但如果此功能是应用的核心部分,则需要提前了解它们。
示例包括安全问题、继承,以及最重要的在实现 API 时公开“冻结”API 的可能性(例如,跨软件版本)。同样,这些都是先进的,本身不应该阻止你。
您可以使用 Berkeley DB 类将 () 对象保存在实现(缓存)中,从而将它们持久化到文件中。它使用起来非常简单,意味着您不必担心将什么保存在哪里。PersistentMap
Serializable
Map
关于序列化需要注意的三件事:
- 您将如何应对架构更改(即更改您的类包含哪些数据 - 例如添加新字段)
- 如果您的文件损坏了怎么办?根据程序存储所需的可靠性,将影响您决定如何保存对象隐式包含的数据。请记住,您始终可以使用关系数据库(如 MySQL),然后将此数据转换为您的对象
- 您是否需要能够在程序外部查看或查询数据?如果你想回答一些简单的问题,比如“有多少对象有属性X”,该怎么办?如果您使用过(关系)数据库,则很容易做到;如果您已将内容序列化为文件,那就没那么容易了!
java.io.Object[Input/Output]Stream 是您需要查看的两个类。
任何希望保存到文件中的类都需要实现 java.io.Serializable 接口。
您可能还需要考虑使用 XML 编码,在我看来,XML 编码比序列化具有更高的持久性。使用类。java.beans.XMLEncoder/XMLDecoder
我没有使用过它,但 Google Code 最近发布了 protobuf。
我同意 mjlee 的观点,即 Google 的 Protocol Buffers 是比原始序列化方式更好的存储对象的方法。看一看,你会爱上它的。
我想知道为什么没有人提到 JSON,例如 Jackson JSON 序列化器。
上一个:什么是组件
评论