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

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

300

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • 已采纳
    w747770454 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 w747770454 2017-08-10 02:24

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

    点赞 评论 复制链接分享

相关推荐