这是我对StackOverflow的第一个问题。如果问题不明确并需要更多细节,请告诉我。
我有一个有三个属性的类:
class SampleClass {
long [] field1;
float[] field2;
float[] field3;
}
构建了一个巨大的SampleClass对象(每个数组大约有十亿个条目)。此对象在一个主机中序列化,序列化文件上载到另一台计算机。现在我想反序列化文件的一部分,这样我就可以得到一个较小的SampleClass对象,每个字段填充大约10个索引,而不是完整的对象。因为这台机器没有足够的容量来加载内存中这么大的对象。这可能吗?
该对象使用JAVA的writeObject方法进行序列化,并且由不同的实用程序完成,因此我无法控制它。提前谢谢。
答案 0 :(得分:0)
您最好的选择是实际序列化您需要的部分,因为您无法控制/覆盖序列化本身。在序列化整个文件并能够反序列化的机器上:
1)将整个文件加载到对象
2)创建SampleClass的新对象
3)将每个数组中所需区域的元素复制到空白SampleClass对象
4)序列化这个较小的版本
如果它有帮助,可以使字段变为瞬态,因此它们不会被序列化。
但是,在我看来,这个对象应该在数据库中:
因此,您可以使用硬盘存储它并查询以获取所需的部分。
答案 1 :(得分:0)
忘记使用Java序列化API - 它仅用于反序列化所有内容。如果您无法控制序列化文件的生成方式,那么您应该考虑自行解析序列化文件并提取必要的部分 - 它并不是那么难。
Java序列化格式已有详细记录(参见例如official docs,informative article),并且存在用于解析格式的工具(例如Serialysis,jdeserialize)尽管它根据格式规范编写自己的工具并不是特别困难。
一旦您可以解析序列化数据,您就可以简单地提取所需内容并跳过您不需要的内容。