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

我试图使用这个例子,但它总是返回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); 

这是最近报告和修复的C(GLib)实现中的一个错误 ,因此您需要从git获取并构建最新的Thrift源以使示例正常工作。

如果您感到好奇,可以在用户邮件列表上看到导致错误被识别的讨论。

经过一些研究并在社区的帮助下,我想出了序列化解决方案,该解决方案不仅适用于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); }