Avro 可以将批量序列化对象存储在单个文件(“对象容器文件”)中。 Avro 支持对 avro 生成的 java 类或 java bean 样式对象的反序列化,在我看来,这两者都过于严格。我很想用杰克逊来做这件事,但我还没有找到一种方法来做到这一点。
单个对象的反序列化与 jackson-dataformat-avro 配合得很好。挑战似乎在于结合 avro(用于读取文件并解析元数据)和 jackson-dataformat-avro 来反序列化文件中的每个对象。
有人知道该怎么做吗?
不幸的是,Avro 为
File
指定的格式与通过线路发送内容(序列化到其他目的地)时的格式略有不同。在前一种情况下,包含 Avro 架构(序列化为 JSON)。目前(Jackson 2.9)尚不支持此格式。
它应该相对容易支持,但并非微不足道,因此希望它能够得到实施。问题在这里跟踪:
https://github.com/FasterXML/jackson-dataformats-binary/issues/8
您可以使用 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);