【问题标题】:How to identify a specific object byte offset value and extract it directly from a serialized binary file?如何识别特定对象字节偏移值并直接从序列化二进制文件中提取?
【发布时间】:2021-02-01 06:06:10
【问题描述】:

我有以下:

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 文件很大,反序列化过程需要一些时间。

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

【问题讨论】:

  • 你不能使用 Java 对象序列化。它是一种错误的串行格式。没有随机访问。

标签: java serialization deserialization extract offset


【解决方案1】:

建议

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

【讨论】:

  • 出于特定原因,我目前正在使用序列化。虽然我意识到使用其他数据存储是解决我的问题的另一种方法,但我想知道我发布的问题是否有答案。
  • @athamrin 请检查SO answer
  • 如果可能,尝试将importantData和其他字段的序列化分离到文件中。
猜你喜欢
  • 2016-10-04
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
相关资源
最近更新 更多