java - Avro 模式演变在反序列化时抛出 EOFException
问题描述
我有一个 no-sql 数据库,我在其中存储序列化的 avro 对象。我使用sbt-avro插件专门生成 java 类addSbtPlugin("com.cavorite" % "sbt-avro-1-8" % "1.1.5")
。现在我想向架构中添加新字段,并且还希望与已经存在的数据向后兼容。但是使用新模式对旧数据进行反序列化正在抛出java.io.EOFException
旧架构:
{
"name": "DNode",
"namespace": "my.model",
"type": "record",
"fields": [
{"name": "prev", "type": ["null", "string"]},
{"name": "next", "type": ["null", "string"]}
]
}
新架构:
{
"name": "DNode",
"namespace": "my.model",
"type": "record",
"fields": [
{"name": "prev", "type": ["null", "string"]},
{"name": "next", "type": ["null", "string"]},
{"name": "size", "type": ["null", "long"], "default": null}
]
}
反序列化代码
def deserialize(bytes: Array[Byte]) = {
val reader = new SpecificDatumReader[DNode](classOf[DNode])
val decoder = DecoderFactory.get().binaryDecoder(bytes, null)
reader.read(null, decoder)
}
投掷
java.io.EOFException
at org.apache.avro.io.BinaryDecoder.ensureBounds(BinaryDecoder.java:473)
at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:128)
at org.apache.avro.io.BinaryDecoder.readIndex(BinaryDecoder.java:423)
at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290)
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179)
at org.apache.avro.specific.SpecificDatumReader.readField(SpecificDatumReader.java:116)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:145)
...
解决方案
推荐阅读
- c# - 在关闭和断开连接 IBM MQ.NET 客户端时设置超时
- android - 如何点击firebaseRecyclerView中的ImageView?
- translation - API 将美国英语翻译成英国英语
- java - 将 get 请求转发到 post 请求的尝试返回不支持的错误 Spring
- html - 为什么盒子不是 100% 高度?
- java - org.apache.spark.sql.AnalysisException:找不到表和视图
- javascript - 谷歌表格脚本编辑器和正确解析 JSON
- machine-learning - 使用自动编码器的 1 的不兼容形状
- webrtc - 如何使用 OpenTok 选择音频输出
- javascript - 数据过滤器默认不显示任何内容