[ https://issues.apache.org/jira/browse/THRIFT-3675?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexandr Rewa updated THRIFT-3675: ---------------------------------- Description: 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. was: 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 {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. > 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 > > 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)