簡體   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