如何使用 Jackson 反序列化 Avro 文件?

问题描述 投票:0回答:2

Avro 可以将批量序列化对象存储在单个文件(“对象容器文件”)中。 Avro 支持对 avro 生成的 java 类或 java bean 样式对象的反序列化,在我看来,这两者都过于严格。我很想用杰克逊来做这件事,但我还没有找到一种方法来做到这一点。

单个对象的反序列化与 jackson-dataformat-avro 配合得很好。挑战似乎在于结合 avro(用于读取文件并解析元数据)和 jackson-dataformat-avro 来反序列化文件中的每个对象。

有人知道该怎么做吗?

java jackson avro jackson-dataformat-avro
2个回答
0
投票

不幸的是,Avro 为

File
指定的格式与通过线路发送内容(序列化到其他目的地)时的格式略有不同。在前一种情况下,包含 Avro 架构(序列化为 JSON)。目前(Jackson 2.9)尚不支持此格式。

它应该相对容易支持,但并非微不足道,因此希望它能够得到实施。问题在这里跟踪:

https://github.com/FasterXML/jackson-dataformats-binary/issues/8


0
投票

您可以使用 Jackson 通过扩展 Jackson 的 ObjectMapper 来实现它,如下所示:

public class AvroJacksonObjectMapper extends ObjectMapper
{
  public AvroJacksonObjectMapper()
  {
    super();
    registerModule(new JavaTimeModule());
    configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    addMixIn(SpecificRecordBase.class, SpecificRecordBaseMixIn.class);
  }

  public abstract class SpecificRecordBaseMixIn
  {
    @JsonIgnore
    abstract void getSchema();

    @JsonIgnore
    abstract void getSpecificData();
  }

}

现在使用此对象映射器将 avro 对象序列化为 json 字符串,反之亦然。

// AvroObject is a class generated out of Avro Schema

ObjectMapper objectMapper = new AvroObjectMapper();    
AvroObject o = objectMapper.readValue("json string", AvroObject.class);
String jsonString = objectMapper.writeValueAsString(avroObject);
© www.soinside.com 2019 - 2024. All rights reserved.