当 avro 模式由另一个模式作为可选字段组成时出现反序列化问题
Issue with deserialization when an avro schema is composed of another schema as an optional field
我们已经定义了一个 avro 架构并使用代码生成器在 Java 和 .cs 文件中生成 .java 文件 C#。
这是我们一直用来从 avro 模式
生成 java 类 的代码生成器
https://plugins.gradle.org/plugin/com.commercehub.gradle.plugin.avro
并使用AvroConverter.exe(来自 Confluen)从 .avsc 文件生成 .cs 文件
现在,我正在尝试使用 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" }
]
}
我可以通过使用 gradle plug-in 设置一个额外的 属性(stringType 为“CharSequence”)来生成我的 .java 来解决这个问题.avsc 文件中的文件。
这是我们用来从 .avsc 文件中生成 .java 文件的 gradle plug-in 的 link
https://plugins.gradle.org/plugin/com.commercehub.gradle.plugin.avro
这是我正在谈论的 属性 的文档
https://github.com/davidmc24/gradle-avro-plugin#stringtype
这是我的 gradle 从 .avsc 文件生成 POJO 的任务
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
我们已经定义了一个 avro 架构并使用代码生成器在 Java 和 .cs 文件中生成 .java 文件 C#。
这是我们一直用来从 avro 模式
生成 java 类 的代码生成器https://plugins.gradle.org/plugin/com.commercehub.gradle.plugin.avro
并使用AvroConverter.exe(来自 Confluen)从 .avsc 文件生成 .cs 文件
现在,我正在尝试使用 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" }
]
}
我可以通过使用 gradle plug-in 设置一个额外的 属性(stringType 为“CharSequence”)来生成我的 .java 来解决这个问题.avsc 文件中的文件。
这是我们用来从 .avsc 文件中生成 .java 文件的 gradle plug-in 的 link
https://plugins.gradle.org/plugin/com.commercehub.gradle.plugin.avro
这是我正在谈论的 属性 的文档 https://github.com/davidmc24/gradle-avro-plugin#stringtype
这是我的 gradle 从 .avsc 文件生成 POJO 的任务
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