我必须将一个巨大的对象树(7,000)序列化到磁盘中.最初我们将这棵树保存在一个带有Kodo的数据库中,但它会使成千上万的查询将这棵树加载到内存中,并且它将占用本地宇宙可用时间的很大一部分.
我为此尝试了序列化,实际上我获得了性能提升.但是,我觉得我可以通过编写自己的自定义序列化代码来改进这一点.我需要尽快加载这个序列化对象.
在我的机器中,序列化/反序列化这些对象大约需要15秒.从数据库加载它们大约需要40秒.
关于我可以做些什么来提高性能的任何提示,考虑到因为对象在树中,它们相互引用?
不要忘记使用"瞬态"关键字作为不必序列化的变量.这样可以提高性能,因为您不再读取/写入不必要的数据.
一种优化是自定义类描述符,以便将类描述符存储在不同的数据库中,而在对象流中只能通过ID引用它们.这减少了序列化数据所需的空间.例如,请参阅一个项目中的SerialUtil和ClassesTable类如何执行此操作.
使类Externalizable而不是Serializable可以带来一些性能优势.缺点是它需要大量的手工工作.
然后还有其他序列化库,例如jserial,它可以提供比Java的默认序列化更好的性能.此外,如果对象图不包含循环,那么它可以更快地序列化,因为序列化程序不需要跟踪它看到的对象(请参阅jserial的FAQ中的 "它是如何工作的?" ).