[ https://issues.apache.org/jira/browse/THRIFT-3675?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15171683#comment-15171683 ]
Alexandr Rewa commented on THRIFT-3675: --------------------------------------- Just double checked it again with optional union fields and confirm that workaround works with C Glib as well. Thanks again for quick response! > Union is not serialized correctly by Thrift C Glib > -------------------------------------------------- > > Key: THRIFT-3675 > URL: https://issues.apache.org/jira/browse/THRIFT-3675 > Project: Thrift > Issue Type: Bug > Components: C glib - Library > Affects Versions: 0.9.3 > Reporter: Alexandr Rewa > Assignee: Jens Geyer > Fix For: 0.1.0 > > > I am trying to serialize Thrift union in C and then deserialize in Java. On > Java side I always get serialized only first field of union. The following > code works correctly with structs but not with union only. > Thrift 0.9.3 > *messages.thrift:* > {code} > struct JLException { > ... > } > struct JLFrame { > ... > } > union JLMessage { > 1: JLException exc, > 2: JLFrame frame > } > {code} > *Serialization code in C* (I replaced with "..." unnecessary parts): > {code} > JLException* jlExeption = g_object_new(TYPE_J_L_EXCEPTION, ... , NULL); > if (jlExeption) { > JLMessage* jlMessage = g_object_new(TYPE_J_L_MESSAGE, "exc", jlExeption, > NULL); > serialize_and_send_thrift_message((ThriftStruct*) jlMessage, > THRIFT_STRUCT_CLASS(J_L_MESSAGE_GET_CLASS(jlMessage))); > g_object_unref(jlExeption); > g_object_unref(jlMessage); > } > JLFrame* jlFrame = g_object_new(TYPE_J_L_FRAME, ... , NULL); > if (jlFrame) { > JLMessage* jlMessage = g_object_new(TYPE_J_L_MESSAGE, "frame", jlFrame, > NULL); > serialize_and_send_thrift_message((ThriftStruct*) jlMessage, > THRIFT_STRUCT_CLASS(J_L_MESSAGE_GET_CLASS(jlMessage))); > g_object_unref(jlFrame); > g_object_unref(jlMessage); > } > {code} > *Deserialization code in Java:* > {code} > TDeserializer deserializer = new TDeserializer(); > JLMessage message = new JLMessage(); > try { > byte[] binData = tuple.getBinary(0); > deserializer.deserialize(message, binData); > } catch (TException e) { > _logger.error(e); > } > if (JLMessage._Fields.EXC.equals(message.getSetField())) { > _logger.info("Received EXCEPTION message"); > } else if (JLMessage._Fields.FRAME.equals(message.getSetField())) { > _logger.info("Received FRAME message"); > } > {code} > As a result on Java side only "Received EXCEPTION message" is logged. For > JLFrame messages it receives empty JLException message. -- This message was sent by Atlassian JIRA (v6.3.4#6332)