我通过maven插件生成了Avro类。在生成的类中,我找到了函数toByteArray()
,并认为它是用于数据的二进制序列化的。不幸的是,输出无法通过flink-avro
反序列化(错误:AvroRuntimeException: Malformed data. Length is negative: -98
)。我意识到使用DatumWriter
进行二进制序列化的输出与toByteBuffer
不同。为什么会这样?
P.s。我准备了一个简短的ScalaTest来重现该内容:
"Avro serializer" should "serialize to byteArray in the same way" in {
val avroData = MyExampleData.newBuilder().setSomeField("xyz").build()
val serializedAvroData = avroData.toByteBuffer.array()
val outputStream = new ByteArrayOutputStream()
val encoder = EncoderFactory.get.binaryEncoder(outputStream, null)
val writer = new SpecificDatumWriter[MyExampleData](classOf[MyExampleData])
writer.write(avroData, encoder)
encoder.flush()
assert(outputStream.toByteArray sameElements serializedAvroData)
}