Hi GZ, Can you try with "pData->parent" part applied too ? Sorry I should have mentioned this too.
On Sat, Nov 28, 2015 at 8:25 AM GZ <[email protected]> wrote: > Hi Nobuaki, > > Yes - the rdata_write was in the generated c file not the header. > > I made the changes you suggested, it was just what I was looking for. I > have repeated the corrected code to help others but unfortunately the > original problem persists.. > > > tbuffer = g_object_new (THRIFT_TYPE_MEMORY_BUFFER, "buf_size", 1000, > 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){ > rdata* pData; > pData = g_object_new (TYPE_RDATA,"flag",1, > "id",27, > "start",12000, > "done",345435, > "notif",34455, > > "spid","XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",NULL); > if(pData){ > ThriftStructClass* cls = > THRIFT_STRUCT_CLASS(RDATA_GET_CLASS(pData)); > len = cls->write(pData,protocol,&error); > > printf ("%d Bytes written to buffer\n", len); > > if(tbuffer->buf != NULL){ > printHex((const void *)tbuffer->buf, 100); > } > g_object_unref (pData); > } > g_object_unref (protocol); > } > g_object_unref(tbuffer); > } > > > The returned buffer length still appears incorrect and the string does not > appear to be serialised into the buffer. > > I can track the writes through the writing function and I notice that for > the spid string value > > thrift_protocol_write_field_begin returns 3 bytes > thrift_protocol_write_string returns 50 bytes > thrift_protocol_write_field_end returns 0 > > the 50 bytes never get added to the length because it is overriden by the > 0. This is a snippit of the code.. > > if ((ret = thrift_protocol_write_field_begin (protocol, "spid", > T_STRING, 6, error)) < 0) > return -1; > xfer += ret; > if ((ret = thrift_protocol_write_string (protocol, this_object->spid, > error)) < 0) > return -1; > if ((ret = thrift_protocol_write_field_end (protocol, error)) < 0) > return -1; > xfer += ret; > > The result is that the write function returns 19 bytes and when I view the > buffer I see no string. I guess I must still be missing something... The > spid string is 46 characters long. I would expect to see this reflected in > the length of the buffer. > > The idl record is > > enum Status { > ONE = 1, > TWO = 2, > THREE = 4, > } > > struct rdata { > 1: Status flag, > 2: i16 id, > 3: i64 start, > 4: i64 done, > 5: i64 notif, > 6: string spid > } > > Any idea what might be happenning? > > Thanks again... > > George > > > > > > > Nobuaki Sukegawa <[email protected]> wrote .. > > It is strange, the generated header has rdata_write ? > > Seeing generated code, it should be something like this: > > > > ThriftStructClass* cls = THRIFT_STRUCT_CLASS(RDATA_GET_CLASS(pData)); > > cls->write(pData->parent, protocol, &error); > > > > On Thu, Nov 26, 2015 at 8:03 AM GZ <[email protected]> wrote: > > > > > I am new to thrift and have been trying to serialize a thrift structure > > > using c but have been unable to get it to work. I want to serialize > using > > > the binary protocol into a memory buffer. I do not need RPC, I will be > > > passing the message into Kafka. Does anyone know the correct way to do > this? > > > > > > I have looked through all the examples and test code and have come up > with > > > the following. It compiles, but is not working correctly. I am clearly > not > > > doing it correctly. rdata_write is a method generated by thrift. > > > > > > GError *error = NULL; > > > ThriftTransport *transport = NULL; > > > ThriftProtocol *protocol = NULL; > > > > > > transport=g_object_new (THRIFT_TYPE_MEMORY_BUFFER, "buf_size", 100, > > > NULL); > > > if(transport){ > > > thrift_transport_open (transport, &error); > > > protocol = g_object_new (THRIFT_TYPE_BINARY_PROTOCOL, > "transport", > > > transport,NULL); > > > if(protocol){ > > > rdata* pData = g_object_new (TYPE_RDATA,"flag",1, > > > "id",27, > > > "start",12000, > > > "done",345435, > > > "notif",34455, > > > "spid","This is the SPID",NULL); > > > if(pData){ > > > > > > /* wanted something like obj->write(protocol,&error) > > > But how to get object? pData does not have write > method > > > */ > > > > > > gint32 len = > > > rdata_write(pData,(ThriftProtocol*)protocol,&error); > > > > > > // Print Content of Buffer > > > ThriftMemoryBuffer* pMem = > (ThriftMemoryBuffer*)transport; > > > if(pMem->buf != NULL){ > > > printHex((const void *)pMem->buf, len); > > > } > > > g_object_unref (pData); > > > } > > > g_object_unref (protocol); > > > } > > > g_object_unref(transport); > > > } > > > > > > Error handling and support functions skipped for brevity. > > > > > > Any help appreciated > > > >
