You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Jens Geyer (JIRA)" <ji...@apache.org> on 2016/02/19 21:34:18 UTC

[jira] [Commented] (THRIFT-3650) incorrect union serialization

    [ https://issues.apache.org/jira/browse/THRIFT-3650?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15154827#comment-15154827 ] 

Jens Geyer commented on THRIFT-3650:
------------------------------------

Thanks to Fynn who [first reported the problem on SO](http://stackoverflow.com/q/35488379/499466).

> incorrect union serialization 
> ------------------------------
>
>                 Key: THRIFT-3650
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3650
>             Project: Thrift
>          Issue Type: Bug
>          Components: C++ - Compiler
>            Reporter: Jens Geyer
>
> With C++ the following {{union}} generates incorrect serialization code:
> {code}
> union type_ex
> {
>     1 : string STRING,
>     2 : i64 INT64,
>     3 : double DOUBLE
> }
> {code}
> This results in all three fields being *unconditionally* written, which not only wastes space on the wire, but also sets all {{__isset}} bits during deserialization. This makes it a bit hard to the other side to find out which {{union}} field is the right one.
> {code}
> uint32_t type_ex::write(::apache::thrift::protocol::TProtocol* oprot) const {
>   uint32_t xfer = 0;
>   apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot);
>   xfer += oprot->writeStructBegin("type_ex");
>   xfer += oprot->writeFieldBegin("STRING", ::apache::thrift::protocol::T_STRING, 1);
>   xfer += oprot->writeString(this->STRING);
>   xfer += oprot->writeFieldEnd();
>   xfer += oprot->writeFieldBegin("INT64", ::apache::thrift::protocol::T_I64, 2);
>   xfer += oprot->writeI64(this->INT64);
>   xfer += oprot->writeFieldEnd();
>   xfer += oprot->writeFieldBegin("DOUBLE", ::apache::thrift::protocol::T_DOUBLE, 3);
>   xfer += oprot->writeDouble(this->DOUBLE);
>   xfer += oprot->writeFieldEnd();
>   xfer += oprot->writeFieldStop();
>   xfer += oprot->writeStructEnd();
>   return xfer;
> }
> {code}
> *Workaround* 
> Add explicit {{optionals}}:
> {code}
> union type_ex
> {
>     1 : optional string STRING,
>     2 : optional i64 INT64,
>     3 : optional double DOUBLE
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)