如何write/read表示对象的二进制文件?

How to write/read binary files that represent objects?

我是 Java 编程新手,我 运行 遇到了这个问题:

我正在创建一个程序来读取 .csv 文件,将其行转换为对象,然后操作这些对象。 更具体地说,应用程序读取每一行并为其提供索引,还从这些行中读取某些值并将它们存储在 TRIE 树中。 然后应用程序可以从存储在树中的值中读取索引,然后检索相应行的完整信息。

我的问题是,尽管最近几天我一直在研究,但我不知道如何将这些结构写入二进制文件,也不知道如何读取它们。 我想在二进制索引文件中写入行(及其索引),并只读取我从 TRIE 中检索到的确切索引。

对于树的写作,我正在寻找这样的东西(在 C 中)

fwrite(tree, sizeof(struct TrieTree), 1, file)

对于 "binary indexed file",我正在考虑编写像 TRIE 这样的对象,并且可能会读取每个对象,直到我读取足够多以达到相应的索引为止,但这可能不是很有效。

概括一下,我需要帮助编写和读取二进制文件中的对象以及有关如何创建索引文件的解决方案。

我认为您(对于初学者)在尝试使用序列化时最好。

这里只是来自 Whosebug 的一个例子:What is object serialization?

(我觉得复制粘贴代码没有意义,请跟着link阅读)

诚然,这还没有解决您的索引创建问题。

这是 Java 本机序列化 Google 协议缓冲区的替代方法。

我将在这个答案中直接引用文档中的大部分内容,所以如果您对更多细节感兴趣,请务必遵循答案末尾的 link。

这是什么:

协议缓冲区是 Google 的语言中立、平台中立、可扩展的结构化数据序列化机制 – 想想 XML,但更小、更快、更简单。

换句话说,您可以在 Java 中序列化您的结构并在 .net、pyhton 等中反序列化。这在 java 本机序列化中没有。

性能:

这可能会因用例而异,但原则上 GPB 应该更快,因为它的构建考虑到了性能和可互换性。 这是堆栈溢出 link 讨论 Java 本机与 GPB:

High performance serialization: Java vs Google Protocol Buffers vs ...?

它是如何工作的:

您可以通过在 .proto 文件中定义协议缓冲区消息类型来指定您希望如何构建要序列化的信息。每个 protocol buffer 消息都是一个小的信息逻辑记录,包含一系列名称-值对。这是 .proto 文件的一个非常基本的示例,它定义了一条包含有关人员信息的消息:

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

一旦您定义了消息,您就可以在 .proto 文件上 运行 应用程序语言的协议缓冲区编译器生成数据访问 classes。这些为每个字段(如 name() 和 set_name())提供简单的访问器,以及 serialize/parse 整个结构 to/from 原始字节的方法。

然后您可以在您的应用程序中使用此 class 来填充、序列化和检索 Person 协议缓冲区消息。然后你可以写一些这样的代码:

Person john = Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .build();
output = new FileOutputStream(args[0]);
john.writeTo(output);

在这里阅读所有相关信息: https://developers.google.com/protocol-buffers/

您可以将 GPB 视为 XSD 描述 XML 结构的替代格式,只是更紧凑且序列化速度更快。