3

我们有 JAVA gradle avro 插件 (davidmc24/gradle-avro-plugin) 生成 shema,并使用默认的 stringType 字符串,它将像这样生成 JAVA POJO:

Class A{
Shema = ...,{"type":"string","avro.java.string":"String"}...
string batchName;
}

然后我们使用相同的avdl文件生成C#包,我们的解决方案是首先使用avro-tools-1.9.1.jar生成avsc文件,它将像这样生成avsc

"fields" : [ {
      "name" : "batchName",
      "type" : "string"
    },

我们有一个 C# producer 和 java consumer,在这种情况下,batchName 不能在 JAVA consumer 端反序列化,我们得到以下错误: org.apache.avro.util.Utf8 cannot be cast to java.lang.String

所以,我的猜测是shema不同步,你能帮忙指出如何让avro-tools-1.9.1.jar也生成类型为avro.java.string关键字的字段,所以我们可以谢谢!

4

1 回答 1

0

GenericDatumReader 交易字符串和 java.lang.String 不同的代码在这里:

if (logicalType != null) {
  Conversion<?> conversion = getData().getConversionFor(logicalType);
  if (conversion != null) {
    return convert(datum, expected, logicalType, conversion);
  }
}

我的解决方案将使用模式注册表。通常,您将在注册表中将前 1 到 5 个字节作为模式 ID。您可以使用该架构淡化数据。并获取和 genericRecord。我认为这应该可以解决您的问题。

于 2020-08-19T07:21:47.497 回答