【问题标题】:Nested specific type de-serialization with Avro使用 Avro 的嵌套特定类型反序列化
【发布时间】:2015-01-26 06:17:02
【问题描述】:

这是我用来生成 Avro 类的架构的相关部分

{"namespace": "com.namespace.kafka.event",
 "type": "record",
 "name": "RecordName",
 "fields": [

    // some fields declared
    ...

    {"name": "products", "type": { "type": "array", "items": 
        {
            "name": "productInfo",
            "type": "record",
            "fields" : [
                {"name": "productId", "type": "int"},
                {"name": "productScore", "type": "float"}
            ]
        }
    }
},

// some more fields declared
...

] }

我能够为此模式生成类并填充它们。所以基本上在这一代中,生成了一个名为 productInfo 的新类,可以满足我的需求。 (后来我将数据发送到 Kafka)。问题是反序列化。我正在使用这样的东西:

GenericData.Array<String> productTuple = (GenericData.Array<String>) record.get("products");

这会为 GenericData 数组的每个元素返回一个字符串(实际上是一个 JSON)。

{"productName" : someName, "productScore" : someScore }

我可以解析这个字符串并得到我想要的,但有没有更“Avro”的方式来做这件事。就像我可以将结果再次转换为这样的 GenericRecord 对象。

GenericData.Array<GenericRecord> productTuple = (GenericData.Array<GenericRecord>) record.get("products");

或者在 productInfo 是从我的 avro 模式生成的类的情况下,这是否有效:

GenericData.Array<productInfo> productTuple = (GenericData.Array<productInfo>) 

不幸的是,我无法对其进行测试,我没有一个简单的设置来这样做。我搜索了整个网络,但找不到这样做的方法。任何帮助将不胜感激。

【问题讨论】:

    标签: java serialization deserialization apache-kafka avro


    【解决方案1】:

    正确的做法是使用:

    GenericData.Array<GenericRecord> productTuple =(GenericData.Array<GenericRecord>) record.get("products");
    

    我相信最后一个可能也可以,但是这个让我可以反序列化 JSON,而不会受到任何类的进一步干扰。

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      相关资源
      最近更新 更多