【发布时间】:2012-11-18 14:29:16
【问题描述】:
我想使用 Apache Avro 来序列化我的数据,我的客户端是用 C++ 编写的,而我的服务器是用 Java 编写的。
-
我的服务器 java 代码如下所示:
Schema scm = new Schema.Parser().parse("....shcema String....."); ByteArrayInputStream inputStream = new ByteArrayInputStream(record.array()); Decoder coder = new DecoderFactory().directBinaryDecoder(inputStream, null); GenericDatumReader<GenericRecord> reDatumReader = new GenericDatumReader<GenericRecord>(scm); try { GenericRecord result = (GenericRecord)reDatumReader.read(null, coder); //here! the result "name", "num_groups" is empty! System.out.println(result.get("name")+" "+result.get("num_groups")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } -
还有我的客户代码:
std::string schemaDescript ="....shcema String....."; std::stringstream rsStream(schemaDescript); avro::ValidSchema rSchema; avro::compileJsonSchema(rsStream, rSchema); avro::EncoderPtr encoder = avro::binaryEncoder(); std::auto_ptr<avro::OutputStream> oStream = avro::memoryOutputStream(); encoder->init(*oStream); avro::GenericDatum rData(rSchema); avro::GenericRecord sReord = rData.value<avro::GenericRecord>(); sReord.setFieldAt(0, avro::GenericDatum("i am nice")); sReord.setFieldAt(1, avro::GenericDatum(1)); sReord.setFieldAt(2, avro::GenericDatum(12)); sReord.setFieldAt(3, avro::GenericDatum(13)); avro::GenericWriter gwriter(rSchema, encoder); gwriter.write(rData); oStream->flush(); std::auto_ptr<avro::InputStream> inSt = avro::memoryInputStream(*oStream); avro::StreamReader instReader(*inSt); size_t outputLen = oStream->byteCount(); uint8_t* theByteData = new uint8_t[outputLen]; instReader.hasMore(); instReader.readBytes(theByteData, outputLen);
我将theByteData 发送到服务器,代码有效(无异常),但结果为空,谁能告诉我有什么问题?
以及为什么在 Java 中我们通过键获得价值:result.get("name");但在 C++ 中,我们通过索引获得价值:record.fieldAt(0).value<string>()。如果我无法使用字符串键获取值,如何将索引与字符串键匹配?
【问题讨论】:
-
感谢 dominikh,编辑了我的问题。
-
3 年后,有什么消息吗?