[
https://issues.apache.org/jira/browse/THRIFT-3650?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jens Geyer updated THRIFT-3650:
-------------------------------
Description:
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}
was:
With C++ the following {{union}} generates incorrect serialization code:
{code}
union type_ex
{
1 : optional string STRING,
2 : optional i64 INT64,
3 : optional double DOUBLE
}
{code}
> 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)