如何识别特定的对象字节偏移值并直接从序列化的二进制文件中提取它?

问题描述

我有以下几点:

public class Building implements Serializable {
    int buildingID;
    String buildingName;
    List<Person> personList;

    ...
}
class Person implements Serializable {
    int age;
    String name;
    byte[] importantData;

    ...
} 

我计划将 Building 序列化为二进制文件。我们可以假设 personList 将包含许多 Person 条目(3GB+)。将来,我计划使用现有的 Building 文件从 personList 中的特定 Person 条目中提取特定的重要数据。目前,对我来说,最直接的方法是将文件反序列化回 Building 对象以获取特定的重要数据。但是,由于这个Building文件比较大,反序列化过程需要一些时间。

我想通过直接从序列化文件中直接读取数据(跳过反序列化)以更快的方式完成此操作。问题是我不确定如何获取或了解重要数据实际存储在文件中的字节偏移值。此外,是否可以在不对序列化的 Building 文件本身运行字节比较的情况下获取此偏移值?

解决方法

建议

  1. 不要使用 java 序列化和普通文件系统来管理大型数据集
  2. 最好使用专用数据存储来跨多个服务实例管理数据
  3. 使用某种列式数据存储,因为您需要获取记录的特定部分
  4. 使用共享数据存储可以提高数据一致性(仍然不能保证,取决于应用逻辑和数据存储支持)
  5. Java 序列化可能会使以后难以更改数据结构
  6. 如果序列化是唯一的选择,那么研究基于 kryo 或 proto 的序列化