最近需要配合C做一些数据解析工作。使用AVRO封装数据。由于C支持的PRC还不完整 没有采用这种方式。而是以流的方式通过HTTP 由C发送给Java解析并存储下来。双方定义相同的schema.目前遇到一个问题。
avro-c 库函数序列化发送的数据没有schema。只包含如图所示的序列化数据。
而Java解析和输出的数据内容均包含scheam 信息和数据信息。尝试过使用内容拼接来解析。但是解析失败了。请问大家 此类问题应该怎样解决
已经找到解决办法。还是因为对API不熟造成的。avro 有方法能够解析无scheam的文件。前提是在类方法中指定一个scheam进行解析。
大致方法如下。
public static List getGenricRecordList(InputStream fin){
List<GenericRecord> grList = new ArrayList<GenericRecord>();
/** 不指定类型 指定schema加载数据**/
DatumReader<GenericRecord> reader=new GenericDatumReader<GenericRecord>(SCHEMA$);
Decoder decoder=DecoderFactory.get().binaryDecoder(fin,null);
while(true){
try{
GenericRecord result=reader.read(null,decoder);
grList.add(result);
}catch(Exception e){
break;
}
}
return grList;
}
由于avro还未完全成熟,读文件到最后会抛出EOF异常。此时就是读到文件末尾了。每一个GenericRecord 是一行数据。使用实例result.get("")方法就可以获得指定内容。
补充一点 Java与C 的通信会存在字节序问题。要写好工具类。数据发送方转换好数据之后再进行发送。