【问题标题】:How to write/read binary files that represent objects?如何写/读代表对象的二进制文件?
【发布时间】:2015-06-11 21:26:24
【问题描述】:

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

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

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

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

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

对于“二进制索引文件”,我正在考虑编写 TRIE 之类的对象,并且可能会读取每个对象,直到我读到足够多的内容以达到相应的索引,但这可能效率不高。

概括地说,我需要帮助在二进制文件中写入和读取对象以及如何创建索引文件的解决方案。

【问题讨论】:

  • 您要查找的术语是serialization
  • 你能告诉我们更多关于你想要存储的对象的数量吗?根据数字,一个简单的 HashMap 可以为索引做。
  • @Marged 我要存储的对象数量可能会有所不同。我想专门存储 3 个 TRIE,其他对象取决于用户的输入。我目前的测试文件有大约 30 个对象要存储,除了 TRIE。

标签: java binaryfiles


【解决方案1】:

我认为您(对于初学者)在尝试使用序列化来做到这一点时最好。

这只是 stackoverflow 中的一个示例:What is object serialization?

(我认为复制粘贴代码没有意义,请点击链接阅读)

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

【讨论】:

  • 这解决了我的问题。这几乎是我在寻找 TRIE 的内容,它可能不是最好的解决方案,但我将 .csv 的每一行转换为一个对象,然后将其放入一个文件中。谢谢!
【解决方案2】:

这是 Java 原生序列化的替代方案,Google Protocol Buffers。

我将主要在此答案中直接引用文档,因此如果您有兴趣了解更多详细信息,请务必点击答案末尾的链接。

这是什么:

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

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

性能:

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

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

它是如何工作的:

您可以通过在 .proto 文件中定义协议缓冲区消息类型来指定您希望序列化信息的结构。每个协议缓冲区消息都是一个小的信息逻辑记录,包含一系列名称-值对。下面是一个非常基本的 .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 文件上运行应用程序语言的协议缓冲区编译器来生成数据访问类。它们为每个字段(如 name() 和 set_name())提供了简单的访问器,以及将整个结构序列化/解析为原始字节的方法。

然后,您可以在应用程序中使用此类来填充、序列化和检索 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 结构的替代格式,只是更紧凑且序列化速度更快。

【讨论】:

  • 我已经将我的应用程序发送到 avaliation(大学项目),但我会明确地检查一下并做一些测试以在下一个项目中使用它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2012-01-26
  • 2018-07-26
  • 2016-06-14
  • 2021-06-03
相关资源
最近更新 更多