繁体   English   中英

如何写/读表示对象的二进制文件?

[英]How to write/read binary files that represent objects?

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

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

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

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

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

对于“二进制索引文件”,我正在考虑编写像TRIE这样的对象,并且可能会读取每个对象,直到我阅读到足以达到相应的索引,但这可能不会非常有效。

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

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

这只是stackoverflow的一个例子: 什么是对象序列化?

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

不可否认,这还没有解决您的索引创建问题。

以下是Java本机序列化(Google Protocol Buffers)的替代方法。

我将在本回答中主要编写文档中的直接引用,因此如果您对更多详细信息感兴趣,请务必按照答案末尾的链接进行操作。

它是什么:

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

换句话说,您可以使用Java序列化您的结构并在.net,pyhton等处反序列化。这在java native serialization中没有。

性能:

这可能会根据使用情况而有所不同,但原则上GPB应该更快,因为它在构建时考虑了性能和可互换性。 这是讨论Java native vs GPB的堆栈溢出链接:

高性能序列化:Java与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视为描述XML结构的XSD的替代格式,更紧凑且序列化更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM