如何用Avro在内存中实现序列化 和反序列化
2015-02-02 16:36
183 查看
最近项目中要用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"));
改怎么选择呢?
如果想把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"));
相关文章推荐
- Avro实现序列化和反序列化
- 如何实现 Gson 序列化/反序列化过程中 过滤指定字段
- 什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储
- Apache Avro 序列化与反序列化 (Java 实现)
- 什么叫序列化,如何实现序列化以及反序列化(转)
- Java序列化,如何实现序列化和反序列化?常见的序列化协议有哪些?
- 前面在《Asp.Net Forums中对.Net中序列化和反序列化的应用》一文中讲了,对于一些扩展属性,可以将字符串集合序列化为二进制,也可以从二进制反序列化为字符串集合。其实我一直有个疑问,对于asp.net中可以很容易实现,但是在asp中该如何?
- 如何序列化与反序列化复杂对象
- C#实现对象的Xml格式序列化及反序列化
- C#实现对象的Xml格式序列化及反序列化
- 通过序列化和反序列化泛型数据实体集合来实现持久化数据对象的方法
- [c#]Webservice中如何实现方法重载(overload)以及如何传送不能序列化的对象作参数
- 如何实现一个支持共享内存的Map或Set
- C#实现对象的Xml格式序列化及反序列化
- C#实现对象的Xml格式序列化及反序列化
- 如何序列化和反序列化 对象,
- [c#]Webservice中如何实现方法重载(overload)以及如何传送不能序列化的对象作参数
- C#实现对象的Xml格式序列化及反序列化
- 如何实现驱动层与应用层共享内存?
- C#实现对象的Xml格式序列化及反序列化