如何用Avro在内存中实现序列化 和反序列化

最近项目中要用Avro对发送到Kafka中的数据进行序列化, 用Avro进行序列化可以有两种方式: 一种是在内存中序列化,另一种是数据文件格式。

改怎么选择呢?

如果想把Avro集成到现有系统,用内存序列化比较好。

其他情况,考虑用Avro的数据文件格式。

Avro官网上对数据文件格式的序列化讲的很清楚,这次不在赘述,只是介绍一下在内存中如何序列化。

我们以一个简单的Avro模式为例

{

  “type":"record",

  "name":"Pair",

  "doc":"A pair of strings.",

  "fields": [

       {"name":"left", "type":"string"},

      {"name":"right", "type":"string"}

     ]

}

将这一模式存贮在一个路劲下(一般是resources路劲下),并命名为Pair.avsc(avsc是Avro模式文件的常用扩展名).

Schema schema= Schema.parse(getClass().getResourceAsStream("Pair.avsc"); //声明要加载的模式

//创建Avro记录的实例,为记录的String字段构建了一个Avro Utf8实例

GenericRecord datum=new GenericData.Record(schema);

datum.put("left",new Utf8("L"));

datum.put("right",new Utf8("R"));

//将记录序列化到输出流中

ByteArrayOutputStream out=new ByteArrayOutputStream();

DatumWriter<GenericRecord> write=new GenericDatumWriter<GenericRecord>(schema);//DatumWriter 将数据对象翻译成Encoder对象可以理解的类型,

Encoder encoder= new BinaryEncoder(out);//然后由Encoder写到数据流。

write.write(datum,encoder);

encoder.flush();

out.close();


//反序列化

DatumReader<GenericRecord> reder=new GenericDatumReader<GenericRecord>(schema);

Decoder decoder=DecoderFactory.defaultFactory().createBinaryDecoder(out.toByteArray(),null);

GenericRecord result=reader.read(null,decoder);

assertThat(result.get("left").toString(),is("L"));

assertThat(result.get("right").toString,is("R"));





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值