serialization - Avro 特定与通用记录类型 - 哪个最好,或者我可以在两者之间转换?

标签 serialization avro

我们正试图在为我们的客户提供通用和特定记录格式之间做出决定
着眼于提供在线模式注册表,客户端可以在模式更新时访问。
我们希望发送以几个字节为前缀的序列化 blob,这些字节表示版本号,因此架构
从我们的注册表中检索可以自动化。

现在,我们遇到了代码示例,说明了通用格式的相对适应性
模式更改,但我们不愿意放弃特定类型提供的类型安全性和易用性
格式。

有没有办法两全其美? IE。我们可以使用和操作特定生成的
内部类,然后让它们在序列化之前自动将它们转换为通用记录?
然后客户端将反序列化通用记录(在查找模式之后)。

此外,客户是否可以将他们收到的这些通用记录稍后转换为特定记录?一些小代码示例会有所帮助!

或者我们是否以错误的方式看待这一切?

最佳答案

您正在寻找的是 Confluent Schema 注册表服务和有助于与此集成的库。

提供一个示例来编写 Serialize De-serialize avro 数据的演变模式。请注意提供来自 Kafka 的样本。

import io.confluent.kafka.serializers.KafkaAvroDeserializer;  
import io.confluent.kafka.serializers.KafkaAvroSerializer; 
import org.apache.avro.generic.GenericRecord; 
import org.apache.commons.codec.DecoderException; 
import org.apache.commons.codec.binary.Hex;

import java.util.HashMap; import java.util.Map;

public class ConfluentSchemaService {

    public static final String TOPIC = "DUMMYTOPIC";

    private KafkaAvroSerializer avroSerializer;
    private KafkaAvroDeserializer avroDeserializer;

    public ConfluentSchemaService(String conFluentSchemaRigistryURL) {

        //PropertiesMap
        Map<String, String> propMap = new HashMap<>();
        propMap.put("schema.registry.url", conFluentSchemaRigistryURL);
        // Output afterDeserialize should be a specific Record and not Generic Record
        propMap.put("specific.avro.reader", "true");

        avroSerializer = new KafkaAvroSerializer();
        avroSerializer.configure(propMap, true);

        avroDeserializer = new KafkaAvroDeserializer();
        avroDeserializer.configure(propMap, true);
    }

    public String hexBytesToString(byte[] inputBytes) {
        return Hex.encodeHexString(inputBytes);
    }

    public byte[] hexStringToBytes(String hexEncodedString) throws DecoderException {
        return Hex.decodeHex(hexEncodedString.toCharArray());
    }

    public byte[] serializeAvroPOJOToBytes(GenericRecord avroRecord) {
        return avroSerializer.serialize(TOPIC, avroRecord);
    }

    public Object deserializeBytesToAvroPOJO(byte[] avroBytearray) {
        return avroDeserializer.deserialize(TOPIC, avroBytearray);
    } }

以下类(class)包含您正在寻找的所有代码。
io.confluent.kafka.serializers.KafkaAvroDeserializer;
io.confluent.kafka.serializers.KafkaAvroSerializer;

请点击链接了解更多详情:

http://bytepadding.com/big-data/spark/avro/avro-serialization-de-serialization-using-confluent-schema-registry/

关于serialization - Avro 特定与通用记录类型 - 哪个最好,或者我可以在两者之间转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33882095/

相关文章:

c++ - 如何实现double的序列化和反序列化?

c# - 序列化同一个类中的多个 DateTime 属性,每个属性使用不同的格式

java - 如何使用 Avro 二进制编码器对 Kafka 消息进行编码/解码?

c++ - C/C++ : Conversion of char[] to int fails, unsigned char[] to int 有效,为什么?

c# - 在 C# 中序列化泛型类

c++ - C++11标准有没有全新的序列化和反射库?

java - 将 org.apache.avro.util.Utf8 转换为 java.lang.String

python - 将avro字节逻辑类型十进制反序列化为十进制

java - avro union的json编码

python : Generate avro schema using pandavro invalid datatype64[ns]