2010-05-21 38 views
0

有没有一种通用的方式来缓存任何类型的对象(在Java类或Word文档等)到内存或磁盘?如何将任何*对象类型缓存到java中的内存/磁盘?

只是序列化对象,并保留文件扩展名(如果它有一个)足以重建对象?

+0

好像你应该更清楚地阐明你的问题中的一些观点。你究竟想要实现什么类型的东西? – User 2010-05-21 16:08:40

回答

1

不确定“or word document”是什么意思。序列化可以用于磁盘缓存,但不确定在内存中使用它的目的是什么,因为只保留原始对象可能会快得多。

更强大的解决方案可能是ehcache它可以管理缓存的大小以及在内存和磁盘之间移动它。

4

您似乎在使用Object这个词来描述2个不同的事物。

如果您的对象是一个Java对象,那么如果您使用java方法来序列化/反序列化对象,那么让该对象实现Serializable就足够了。

如果要从文件系统中缓存任意数据,最好的方法是在字节数组(或ArrayList)中读取它。然后你可以把数组写回磁盘或者你想要的地方。

3

如果你在谈论内置的Java serialization,那么你甚至不需要保留文件扩展名。序列化表单具有足够的信息,这样反序列化过程将生成一个完全相同的对象,而无需任何其他帮助。不过,根据代码结构的不同,您可能需要为自己的自己的好处存储一些元数据,以便知道如何将结果Object转换为。

注意,Java序列化似乎并不适合您的需求,虽然 - 它不能序列任何类型的对象,只有那些实现Serializable。也许你需要更多地考虑“简单地序列化对象”的含义,因为这是一个问题。

3

有一类对象不能以有意义的方式反序列化。想想一个正在传输文件的开放式网络连接。您无法将其存储到磁盘,关闭您的应用程序,打开您的应用程序,反序列化该连接并期望它“继续”。

Java有一个接口Serializable,它表明一个对象可以被序列化。这取决于你确保这确实是可能的。如果所有持有的数据都是可序列化的,或者不是可序列化的数据标记为瞬态的,那么通常情况下,对象是可序列化的。

这并不是说在理论上,你不能将内存内容作为字节流转储到文件中,并在以后再读回。你可以建立像我想的那样的东西。但是,期望它的作用完全不同。

总之,不可能序列化任何类型。但是,有一种通用的方法来序列化标记为Serializable的Java对象。

0

如果您想知道该问题的跨平台(磁盘或内存)持久性部分,请参阅Java的Preferences类。

-2

您不能序列化Java中的任何对象。此外,Java使用浅拷贝(或称为别的东西)来进行序列化,所以如果你想要像HashMap那样分离它,它可能不会保存你的数据。

+0

事实并非如此。 – paulmurray 2011-02-24 00:02:12

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

所以基本上 - 不,你不能连载任何旧的对象。你必须设计意图被序列化的对象,理想情况下,他们对于自己如何进入和离开流有一些智慧。