【问题标题】:does avro C implementation support streaming rather than file output?avro C 实现是否支持流而不是文件输出?
【发布时间】:2015-08-06 10:50:46
【问题描述】:

我浏览了avro的C文档 我看到我只能将 avro 输出保存到文件中。如何将序列化输出到缓冲区,以便我可以通过 tcp 套接字发送。非常感谢任何帮助。

【问题讨论】:

  • 为什么不直接写入套接字?
  • 非常感谢任何帮助。 嗯,感谢您对唯一答案的评论可能会很好。

标签: c avro


【解决方案1】:

有一个avro_writer_memory() 正好适合这种情况,它以缓冲区指针和长度作为参数,并为您提供可用于常规写入函数的avro_writer_t。您可以在测试中找到它的用法,例如 thisthis。最小的示例将是这样的(将编码值输出到 stderr,因此最好将其重定向到某个文件并在程序运行后检查它):

#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;
}

此外,还有一个avro_writer_memory_set_dest() 允许设置新缓冲区以供现有写入器使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多