[
https://issues.apache.org/jira/browse/THRIFT-370?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12681957#action_12681957
]
Jérémie BORDIER commented on THRIFT-370:
----------------------------------------
The problem here is a real behavior inconsistency between languages. The point
here is that if the field is not declared as optional in the thrift file, the
C++ implementation always gets it serialized and the server receives it as an
empty string and considers the field as set. Unlike Java, C++ doesn't have
"null" values for objects, and "" is the default value. We could have this
fixed by serializing the string only when it's set, and forcing the set via the
constructor or via a setter (so the __isset.field boolean gets updated
consistently), but this would lead into backward compatibilities issues as
there's currently no setters and the fields are public (which makes me wonder
if the __isset flag is actually used somewhere..)
I'm available to get the patch done, i already have something working but not
cleaned.
> unset fields in structs in c++ have __isset set to true
> -------------------------------------------------------
>
> Key: THRIFT-370
> URL: https://issues.apache.org/jira/browse/THRIFT-370
> Project: Thrift
> Issue Type: Bug
> Components: Library (C++)
> Affects Versions: 0.1
> Environment: Linux 2.6.27-11 x86_64
> Reporter: Nick Lanham
> Fix For: 0.1
>
> Attachments: issetTest.tar.gz
>
>
> If you have a struct like:
> struct test_struct {
> 1:string test_string
> }
> and then in a c++ client you do:
> test_struct foo;
> client.someFunc(foo)
> then the server will see it's argument (arg) as having
> arg.__isset.test_string set to true.
> similarly from the client side if expect a return value and do:
> test_struct returnVal;
> client.someFunc(returnVal);
> and the server does not set the returnVal to anything it will still see
> returnVal.__isset.test_string as true
> in all cases the string *is* set to the empty string as the constuctor for
> test_struct sets it, but __isset should not be true.
> Attached (should be) a simple test case. Just untar run "thrift --gen cpp
> isset.thrift" and then run make. start up the server and run the client to
> see the output.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.