Thrift:是否可以仅使用C(GLib)Thrift库进行序列化?

时间:2015-12-16 16:37:16

标签: c serialization thrift

我正在尝试使用this示例,但它总是返回write_len = 10个字节。

ThriftTransport* transport = THRIFT_TRANSPORT(
    g_object_new(THRIFT_TYPE_MEMORY_BUFFER, "buf_size", 8096, NULL));
ThriftProtocol* protocol = THRIFT_PROTOCOL(
    g_object_new(THRIFT_TYPE_BINARY_PROTOCOL, "transport", transport,
        NULL));

Exception* src = g_object_new(TYPE_EXCEPTION, NULL);
ExceptionClass* cls = EXCEPTION_GET_CLASS(src);
g_object_set(src,
    "ex_sign", exception_signature,
    "cl_sign", class_signature,
    "caught", catch_method != NULL,
    NULL);

int write_len = THRIFT_STRUCT_CLASS(cls)->write(THRIFT_STRUCT(src), protocol, &error);

2 个答案:

答案 0 :(得分:1)

最近报告并修复了a bug in the C (GLib) implementation,因此您需要从git中获取并构建the latest Thrift source以使示例正常工作。

如果您感到好奇,可以看到导致该错误被识别的the discussion on the user mailing list

答案 1 :(得分:1)

经过一些研究并在社区的帮助下,我想出了序列化解决方案,该解决方案不仅适用于master分支,还适用于0.9.3版本。实际上我们根本不需要变量write_len:

ThriftMemoryBuffer* tbuffer = g_object_new(THRIFT_TYPE_MEMORY_BUFFER,
    "buf_size", 2048, NULL);
ThriftTransport *transport = NULL;
ThriftProtocol* protocol = NULL;
GError* error = NULL;

if (tbuffer) {
    transport = THRIFT_TRANSPORT(tbuffer);
    thrift_transport_open(transport, &error);

    protocol =
    THRIFT_PROTOCOL(
        g_object_new(THRIFT_TYPE_BINARY_PROTOCOL, "transport", transport, NULL));

    if (protocol) {
        ExceptionData* exception_data = g_object_new(TYPE_EXCEPTION_DATA, "ex_sign",
            exception_signature, "cl_sign", class_signature, "caught",
            catch_method != NULL,
            NULL);

        if (exception_data) {
            ThriftStructClass* cls = THRIFT_STRUCT_CLASS(EXCEPTION_DATA_GET_CLASS(exception_data));
            cls->write(exception_data, protocol, &error);

            if(tbuffer->buf != NULL) {

                printf("Buffer length %i bytes\n", tbuffer->buf->len);

                send_kafka_message((const void *)tbuffer->buf->data, tbuffer->buf->len);
            }

            g_object_unref(exception_data);
        }

        g_object_unref(protocol);
    }

    if (thrift_transport_is_open(transport)) {
        thrift_transport_close(transport, &error);
    }

    g_object_unref(tbuffer);
}