w747770454
2017-08-07 02:38
采纳率: 40%
浏览 1.3k
已采纳

高分悬赏 apache avro数据 C与Java通信 序列化问题

最近需要配合C做一些数据解析工作。使用AVRO封装数据。由于C支持的PRC还不完整 没有采用这种方式。而是以流的方式通过HTTP 由C发送给Java解析并存储下来。双方定义相同的schema.目前遇到一个问题。
avro-c 库函数序列化发送的数据没有schema。只包含如图所示的序列化数据图片说明
而Java解析和输出的数据内容均包含scheam 信息和数据信息。尝试过使用内容拼接来解析。但是解析失败了。请问大家 此类问题应该怎样解决

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • w747770454 2017-08-10 02:22
    已采纳

    已经找到解决办法。还是因为对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("")方法就可以获得指定内容。
    
    点赞 打赏 评论
  • w747770454 2017-08-10 02:24

    补充一点 Java与C 的通信会存在字节序问题。要写好工具类。数据发送方转换好数据之后再进行发送。

    点赞 打赏 评论

相关推荐 更多相似问题