繁体   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