我正在尝试使用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);
答案 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);
}