Ho letto il documento C allo avro e vedo che posso ottenere solo l'output avro in un file. Come ottengo l'uscita serializzata su un buffer in modo che possa inviare tramite una presa tcp. Ogni aiuto è molto apprezzato.lo streaming di supporto per l'implementazione di avro C piuttosto che l'output di file?
10
A
risposta
2
C'è un avro_writer_memory()
esattamente per questo caso, prende il puntatore del buffer e la lunghezza come parametri e fornisce avro_writer_t
che può essere utilizzato nelle normali funzioni di scrittura. Puoi trovarne l'utilizzo nei test, come this o this. L'esempio minima sta per essere qualcosa di simile (l'output valore codificato a stderr, quindi meglio di reindirizzamento che ad una certa lima ed esaminarlo dopo l'esecuzione del programma):
#include <avro.h>
#include <stdio.h>
#include <unistd.h>
static const char json_schema[] = "{ \"type\": \"string\" }";
int main(void)
{
char buf[1024];
avro_writer_t writer;
avro_schema_t schema;
avro_value_iface_t* iface;
avro_value_t val;
size_t len;
if (avro_schema_from_json_literal(json_schema, &schema) != 0) {
printf("failed to initialize schema\n");
goto out;
}
if ((writer = avro_writer_memory(buf, sizeof(buf))) == NULL) {
printf("failed to initialize writer\n");
goto out_schema;
}
if ((iface = avro_generic_class_from_schema(schema)) == NULL) {
printf("failed to get class from schema\n");
goto out_writer;
}
if (avro_generic_value_new(iface, &val) != 0) {
printf("failed to create new value\n");
goto out_iface;
}
if (avro_value_reset(&val) != 0) {
printf("failed to reset value\n");
goto out_val;
}
if (avro_value_set_string(&val, "some string wrapped by avro") != 0) {
printf("failed to set value string\n");
goto out_val;
}
if (avro_value_write(writer, &val) != 0) {
printf("failed to write value into the buffer\n");
goto out_val;
}
len = avro_writer_tell(writer);
printf("got %lu bytes\n", (unsigned long)len);
if (write(STDERR_FILENO, buf, len) != len) {
printf("failed to write to stderr, oops\n");
goto out_val;
}
out_val:
avro_value_decref(&val);
out_iface:
avro_value_iface_decref(iface);
out_writer:
avro_writer_free(writer);
out_schema:
avro_schema_decref(schema);
out:
return 0;
}
Inoltre, v'è un avro_writer_memory_set_dest()
che permette di impostare nuovi buffer da utilizzare dallo scrittore esistente.
Perché non scrivere solo sulla presa? –
_Qualsiasi aiuto è molto apprezzato._ Hmmm, un commento di ringraziamento per l'unica risposta potrebbe essere carina. – ryyker