Ich möchte mit Apache Avro meine Daten serialisieren, mein Client ist in C++ geschrieben und mein Server ist in Java geschrieben.Wie verwende ich Apache avro GenericRecord für dynamische Daten?
Mein Server Java-Code sieht wie folgt aus:
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(); }
Und mein Client-Code:
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);
ich die theByteData
an den Server senden, funktioniert der Code (keine Ausnahme), aber das Ergebnis ist leer, kann mir jemand sagen, was los ist?
Und warum in Java wir Wert mit Schlüssel erhalten: result.get("name")
; aber in C++ bekommen wir den Wert mit dem Index: record.fieldAt(0).value<string>()
. Wenn ich mit dem Zeichenfolgenschlüssel keinen Wert erhalten kann, wie wird der Index dem Zeichenfolgenschlüssel zugeordnet?
Dank schreiben dominikh, bearbeitet meine Frage. – user1833610
3 Jahre später, irgendwelche Neuigkeiten? –