是否存在将任何类型的对象(在java类或word文档等中)缓存到内存或磁盘的通用方法?
只是序列化对象,并保留文件扩展名(如果有的话)足以重建对象?
答案 0 :(得分:4)
您似乎使用“对象”这个词来描述两种不同的东西。
如果您的对象是Java对象,那么如果您随后使用java方法序列化/反序列化对象,那么让该对象实现Serializable就足够了。
如果要从文件系统缓存任意数据,最好的方法是在字节数组(或ArrayList)中读取它。然后,您可以将数组写回磁盘或您想要的位置。
答案 1 :(得分:3)
如果您正在谈论内置的Java serialization,那么您甚至不需要保留文件扩展名。序列化表单具有足够的信息,以便反序列化过程将生成相同的对象,而无需任何其他帮助。我想,根据您的代码的结构,您可能需要为拥有的好处存储一些元数据,以便您知道将生成的Object
转换为什么。
请注意,Java序列化似乎不符合您的要求 - 它不能序列化任何类型的对象,只能序列化那些实现Serializable
的对象。也许你需要更多地思考一下“简单地序列化对象”的意思,因为这就是问题所在。
答案 2 :(得分:3)
没有
有一类对象无法以有意义的方式反序列化。想象一下正在传输文件的开放式网络连接。您无法将其存储到磁盘,关闭应用程序,打开应用程序,反序列化该连接并期望它“只是继续”。
Java有一个Serializable接口,表示对象可以被序列化。你应该确保这确实是可能的。通常,如果对象是Serializable,如果它拥有的所有数据都是Serializable,或者不是Serializable的数据被标记为瞬态。
这并不是说理论上你不能将内存内容作为字节流转储到文件中,稍后再读回来。你可以构建类似我想的东西。但是期望它的工作完全不同。
简而言之,无法序列化任何类型。但是,有一种通用的方法可以序列化标记为Serializable的Java对象。
答案 3 :(得分:1)
不确定“或单词文档”的含义。序列化可用于磁盘缓存,不确定在内存中使用它的目的是什么,因为简单地保留原始对象可能要快得多。
更强大的解决方案可能是ehcache它可以管理缓存的大小以及在内存和磁盘之间移动它。
答案 4 :(得分:0)
如果您想知道问题的跨平台(磁盘或内存)持久性部分,请查看Java的Preferences类。
答案 5 :(得分:0)
我的,有很多答案!
任何对象都可以通过实现java.io.Serializable来实现自身的序列化。
可是:
默认的序列化程序在ObjectOutputStream中实现,它只是遍历对象树。这对于简单的javabean类型对象来说很好,但它可能会产生不良影响,例如系统对象被序列化(我曾经检查过一个序列化的java对象文件,发现它包含了所有的系统时区对象)。当然,如果您的对象中包含不可序列化(而非瞬态)的对象,则ObjectOutputStream将抛出异常。
(实际上,即使对于JavaBean对象,默认的序列化程序也很糟糕 - 默认的序列化程序会为每个字符串字段发出java.lang.String的类名。)
因此,如果您的对象很复杂,那么您真的应该实现Externalizable并使用一些智能编写一个序列化器和反序列化器。
http://download.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html#7185
所以基本上 - 不,你不能序列化任何旧对象。您必须设计要序列化的对象,理想情况下,它们有一些关于它们如何从流中获取的智能。
答案 6 :(得分:-2)
您无法在Java中序列化任何对象。此外,Java使用浅复制(或称为其他东西)进行序列化,因此如果您想要像HashMap这样的东西,它可能无法保存您的数据。