Apache Avroを使用してデータをシリアル化したい、クライアントがC++で書かれていて、サーバーがJavaで書かれています。動的データにapache avro GenericRecordを使用するには?
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();
}
そして、私のクライアントコード:
私のサーバーのJavaコードは次のようになり、私は、サーバーに
theByteData
送信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);
、コードが動作します(例外はありません)、結果は空ですが、何が間違っているか教えてください。
なぜJavaでは、キーで値が得られるのですか:result.get("name")
;しかし、C++ではインデックス:record.fieldAt(0).value<string>()
で値を取得します。文字列キーで値を取得できない場合、その文字列キーにインデックスを一致させる方法は?
としてエンコーダーオブジェクト自体を使用して書くことができます
でなければなりませんdominikhのおかげで、私の質問を編集しました。 – user1833610
3年後、ニュースはありますか? –