在Avro中,在GenericRecord上调用toString()和使用JSONEncoder之间有什么区别吗?

alp*_*oop 6 java json avro

我有一些Avro的数据作为GenericRecordS IN的Java,我要转换为JSON,我发现有两种方法可以做到这一点:一个涉及到使用JsonEncoder,以及其他涉及到简单的调用toString()GenericRecord.

经过一些简短的实验,两种方法似乎都产生了相同的结果,并且使用JsonDecoder两种情况都可以将生成的JSON字符串转换回Avro .所以,我的问题是:

这两者之间是否有任何功能差异,是否有任何理由使用一个而不是另一个?

我正在使用Avro 1.7.7.

alp*_*oop 13

在进一步测试一下Avro源代码之后,似乎GenericRecord上的toString()方法是由GenericData.Record.toString()实现的,它调用GenericData.toString().这个方法的javadoc声明它应该提供记录的有效JSON表示,它就是这样做的.

但是,它的实现与JsonEncoder的不同之处在于JsonEncoder使用了Jackson库,并且更加关注Avro架构.GenericRecord.toString()方法只是使用StringBuilder遍历记录并构建JSON表示,并且不会如此密切关注Avro架构.

这意味着有些情况下调用toString()将生成一个无法使用JSONDecoder反序列化的JSON表示,例如在模式包含联合的情况下.

基于此,看起来像toString()方法是获取记录的人类可读表示的简单方便的方法,但作为根据模式序列化数据的方式是不可靠的.