簡體   English   中英

將字節緩沖區反序列化為 Avro

[英]Deserializing Byte Buffer to Avro

我想將數據從字節數組反序列化為 Avro 生成的類。

數據來自一個文件映射,該文件映射是在另一個用 C++ 編寫的進程中編寫的,我無法控制。 本質上,數據來自一個更大的結構,其中每個項目都被轉換為字節,然后放入一個數組中。 例如

struct Sample {
    int firstInt;
    float firtFloat;
    int secondInt;
    ...
}

前 4 個字節是firstInt數據,接下來的 4 個字節是浮點數,依此類推。 當我嘗試讀取字節時

AvroClassName.fromByteBuffer(bBuffer(0, 500));

我收到一個錯誤:

Exception in thread "main" org.apache.avro.message.BadHeaderException: Unrecognized header bytes: 0x5A 0x03

我認為發生這種情況是因為 Avro 期望緩沖區數據采用 Avro 本身序列化的特定格式。

我可能會使用某種構建器,手動將緩沖區的每個部分映射到 Avro 對象字段,但由於此類中有數百個字段,因此這不是最佳策略。

是否有任何方法可以將數據反序列化為 Avro 生成的對象? Avro 類中字段的順序與它們在字節緩沖區中出現的順序相同。

您描述的二進制數據不會反序列化為 avro。

我認為發生這種情況是因為 Avro 期望緩沖區數據采用 Avro 本身序列化的特定格式。

您已經回答了自己的問題,但想想為什么不太可能有您想要的通用實用方法是很有趣的。

  1. 反序列化器需要知道通過強制轉換為字節來序列化字段的運行時的字節序。 https://en.wikipedia.org/wiki/Endianness 在 C++ 的情況下,這可能是運行代碼的機器的字節序。 當這是一個問題時,通常有兩種序列化策略。 序列化器修復序列化字節的字節序(例如網絡字節順序),或者包括一個通常稱為“字節順序標記”的指示符,它允許反序列化器正確推斷序列化架構的字節序並正確反序列化。 您的問題表明這些都不存在於序列化數據中。
  2. C++ 標准僅定義了數字數據類型的最小大小。 這意味着序列化的“int”字段原則上可以是任何大小的 32 位或更多。

這兩個歧義可能有助於解釋為什么您的二進制數據需要一些特殊處理。 您可能可以根據您對序列化機器和/或編譯器的了解來解決這些問題。 然而,這通常超出了一般序列化庫的范圍,后者通常僅限於序列化和反序列化它們自己的二進制數據格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM