Я пытаюсь десериализовать поток байтов avro в объект класса случая scala. По сути, у меня был поток kafka с потоком данных, закодированных в avro, и теперь есть дополнение к схеме, и я пытаюсь обновить класс случая scala для включения нового поля. Класс case выглядит следующим образом
/** Case class to hold the Device data. */
case class DeviceData(deviceId: String,
sw_version: String,
timestamp: String,
reading: Double,
new_field: Option[String] = None
) {
this () = this ("na", "na", "na", 0, None)
}
Схема avro выглядит следующим образом:
{
"type": "record",
"name": "some_name",
"namespace": "some_namespace",
"fields": [
{
"name": "deviceId",
"type": "string"
},
{
"name": "sw_version",
"type": "string"
},
{
"name": "timestamp",
"type": "string"
},
{
"name": "reading",
"type": "double"
},
{
"name": "new_field",
"type": ["null", "string"],
"default": null
}]}
Когда данные получены, я получаю следующее исключение:
java.lang.RuntimeException: java.lang.InstantiationException
Я могу получать данные, просто отлично, для потребителя, написанного на python, так что я знаю, что данные передаются в правильном формате в правильном формате.
Я подозреваю, что проблема заключается в создании конструктора класса case, я пытался сделать это:
/** Case class to hold the Device data. */
case class DeviceData(deviceId: String,
sw_version: String,
timestamp: String,
reading: Double,
new_field: Option[String]
) {
this() = this("na", "na", "na", 0, some("na"))
}
но не повезло.
Код десериализатора (выдержки):
// reader and decoder for reading avro records
private var reader: DatumReader[T] = null
private var decoder : BinaryDecoder = null
decoder = DecoderFactory.get.binaryDecoder(message, decoder)
reader.read(null.asInstanceOf[T], decoder)
Я не смог найти других примеров наличия конструкторов для классов дел, которые используются для десериализации avro, в прошлом году я написал соответствующий вопрос java.lang.NoSuchMethodException для метода init в классе дел Scala и основываясь на ответе, я смог реализовать свой текущий код, который с тех пор работал нормально.