当前位置: 首页 > 知识库问答 >
问题:

当avro模式由另一个模式作为可选字段组成时,反序列化问题

尉迟默
2023-03-14

我们定义了一个avro模式,并使用代码生成器在Java和

这是我们用来从avro模式生成java类的代码生成器

https://plugins.gradle.org/plugin/com.commercehub.gradle.plugin.avro

和使用

现在,我尝试使用c#生产者将消息发布到Kafka上,并尝试使用java消费者消费它。这适用于大多数数据类型,但以下合同“OptionalComposition”除外。

{
 "type": "record",
 "name": "OptionalComposition",
 "doc": "Contract to test composition with optional field ",
 "namespace": "com.abc.avro.contracts",
 "fields": [
{ "name": "partOf", "type": ["null", "com.abc.avro.contracts.Reference"], "default": null }
]
 }
{
 "type": "record",
 "name": "Reference",
 "namespace": "com.abc.avro.contracts",
 "fields": [
{ "name": "identifier", "type": "string" }
,
{ "name": "name", "type": "string" }
]
 }

共有1个答案

花博厚
2023-03-14

我能够通过使用我的gradle插件设置一个额外的属性(stringType到“CharSequence”)来解决这个问题,以从. avsc文件生成我的. java文件。

以下是我们用于从.avsc文件生成.java文件的gradle插件的链接

https://plugins.gradle.org/plugin/com.commercehub.gradle.plugin.avro

以下是我正在谈论的物业的文档 https://github.com/davidmc24/gradle-avro-plugin#stringtype

这是我用来生成POJOs的gradle任务。avsc文件

task generateContracts(type: GenerateAvroJavaTask, dependsOn: clearContracts) {
    fieldVisibility = "PRIVATE"
    dateTimeLogicalType = 'JSR310'
    outputCharacterEncoding = "UTF-8"
    stringType = "CharSequence"
    source("src/main/resources/avro")
    outputDir = file("src/main/java/")
}

通过添加stringType=“CharSequence”,我们要求代码生成器生成字符串类型属性,以将java.lang.CharSequence作为数据类型,而不是java.lang.String

 类似资料:
  • 我在两个独立的AVCS模式文件中定义了记录的两个版本。我使用命名空间来区分版本SimpleV1.avsc 示例JSON 版本2只是有一个带有默认值的附加描述字段。 SimpleV2.avsc 示例JSON 这两个模式都序列化为Java类。在我的示例中,我将测试向后兼容性。V1写入的记录应由使用V2的读取器读取。我希望看到插入默认值。只要我不使用枚举,这就可以工作。 检查读者作家兼容性方法确认模式是

  • 我一直在尝试将avro通用记录进行串行化,并生成avro串行化的数据发送给Kafka。主要目标是不使用合并模式注册表存储模式,而是将模式与序列化数据一起发送,以便从kafka主题中提取并反序列化。 下面是AvroSerializer用于生成Avro数据的部分。 Kafka中出现的序列化数据如下所示。

  • 我目前正在寻找意外行为的解决方案,这些意外行为是在使用Java处理特定的AVRO模式演化场景时出现的,我还在消费者中做了一次深度复制,将GenericRecord类解析为从AVRO模式生成的特定类。 为了解释正在发生的事情,我将使用一个简化的模式示例: 这只是一个简单的模式,有三个字符串字段,都是可选的,因为它们都有默认值。假设在某个时候我想添加另一个字符串字段,并删除一个字段,因为不再需要它,您

  • 我收到Kafka主题中的二进制Avro文件,我必须对它们进行反序列化。在Kafka收到的消息中,我可以在每条消息的开头看到一个模式。我知道不嵌入模式并将其与实际的Avro文件分离是一种更好的做法,但我无法控制生产者,也无法更改。 我的代码在Apache Storm上运行。首先,我创建一个读卡器: 然后,我尝试反序列化消息,但不声明架构: 但当消息到达时,我会收到一个错误: 我看到的所有答案都是关于

  • 我正在使用kafka从源接收数据,我正在使用用< code>Node.js编写的消费者应用程序,并使用< code>kafka-node连接到kafka服务器。另一方面,生产者是用< code>Java编写的,他们使用一些kafka流库来产生带有模式的avro消息。我可以接收消息,但它们是avro序列化的,下面是我接收的序列化消息格式- 我正在尝试反序列化它,但无法使用 npm模块,因为avsc只

  • 我有两个问题: > 我曾尝试使用模式V1编写记录,并使用模式V2读取记录,但出现以下错误: org.apache.avro。AvroTypeException:找到foo,应为foo 我使用avro-1.7.3和: 以下是这两种模式的示例(我也尝试过添加命名空间,但没有成功)。 架构V1: 架构V2: 提前谢谢。