You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Nicolas V. (JIRA)" <ji...@apache.org> on 2017/11/09 09:12:00 UTC

[jira] [Updated] (THRIFT-4381) Wrong bitfield value after transmission

     [ https://issues.apache.org/jira/browse/THRIFT-4381?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Nicolas V. updated THRIFT-4381:
-------------------------------
    Description: 
The bitfield field is set to true for every field after deserialization of a Thrift message structure.

Here is a simple test program : 


{code:java}
public class BitFieldTest
{
	public static void main(String[] args) throws TException
	{
		final CBChannel chan = new CBChannel();
		chan.setId(42L);
		chan.setName("test");

		// should return true, true, false
		System.out.println("id is set ? " + chan.isSetId());
		System.out.println("name is set ? " + chan.isSetName());
		System.out.println("duration max is set ? " + chan.isSetDurationMax());

		final TProtocolFactory protoFactory = new TCompactProtocol.Factory();
		final byte[] buf = new TSerializer(protoFactory).serialize(chan);
		System.out.println("\n---- Hexdump serialized message : ----\n" + HexTools.toHexString(buf));

		final CBChannel chanDst = new CBChannel();
		new TDeserializer(protoFactory).deserialize(chanDst, buf);
		System.out.println("---- toString() of deserialized api msg : ----\n" + chanDst);

		// should return true, true, false
		System.out.println("\nid is set ? " + chanDst.isSetId());
		System.out.println("name is set ? " + chanDst.isSetName());
		System.out.println("duration max is set ? " + chanDst.isSetDurationMax());
	}
}
{code}

The output is :


{noformat}
id is set ? true
name is set ? true
duration max is set ? false

---- Hexdump serialized message : ----
00	16 54 18 04 74 65 73 74 12 26 00 16 00 16 00 16 	.T..test.&......
10	00 16 00 16 00 16 00 00                         	........

---- toString() of deserialized api msg : ----
CBChannel(id:42, name:test, enabled:false, type:null, durationMin:0, durationMax:0, inactivityAlarm:0, analogicConfiguration:0, digitalConfiguration:0, voipConfiguration:0, r17Index:0, group:null)

id is set ? true
name is set ? true
duration max is set ? true
{noformat}

You can see that the last test for is set on the durationMax field return true, when it sould return false.



  was:The bitfield field is set to true for every field after deserialization of a Thrift message structure.


> Wrong bitfield value after transmission
> ---------------------------------------
>
>                 Key: THRIFT-4381
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4381
>             Project: Thrift
>          Issue Type: Bug
>          Components: Java - Library
>    Affects Versions: 0.10.0
>         Environment: Linux Arch / Oracle JDK v1.8.0u152
> and
> Windows 7 / Oracle JDK v1.8.0u151
>            Reporter: Nicolas V.
>            Priority: Critical
>              Labels: newbie, usability
>
> The bitfield field is set to true for every field after deserialization of a Thrift message structure.
> Here is a simple test program : 
> {code:java}
> public class BitFieldTest
> {
> 	public static void main(String[] args) throws TException
> 	{
> 		final CBChannel chan = new CBChannel();
> 		chan.setId(42L);
> 		chan.setName("test");
> 		// should return true, true, false
> 		System.out.println("id is set ? " + chan.isSetId());
> 		System.out.println("name is set ? " + chan.isSetName());
> 		System.out.println("duration max is set ? " + chan.isSetDurationMax());
> 		final TProtocolFactory protoFactory = new TCompactProtocol.Factory();
> 		final byte[] buf = new TSerializer(protoFactory).serialize(chan);
> 		System.out.println("\n---- Hexdump serialized message : ----\n" + HexTools.toHexString(buf));
> 		final CBChannel chanDst = new CBChannel();
> 		new TDeserializer(protoFactory).deserialize(chanDst, buf);
> 		System.out.println("---- toString() of deserialized api msg : ----\n" + chanDst);
> 		// should return true, true, false
> 		System.out.println("\nid is set ? " + chanDst.isSetId());
> 		System.out.println("name is set ? " + chanDst.isSetName());
> 		System.out.println("duration max is set ? " + chanDst.isSetDurationMax());
> 	}
> }
> {code}
> The output is :
> {noformat}
> id is set ? true
> name is set ? true
> duration max is set ? false
> ---- Hexdump serialized message : ----
> 00	16 54 18 04 74 65 73 74 12 26 00 16 00 16 00 16 	.T..test.&......
> 10	00 16 00 16 00 16 00 00                         	........
> ---- toString() of deserialized api msg : ----
> CBChannel(id:42, name:test, enabled:false, type:null, durationMin:0, durationMax:0, inactivityAlarm:0, analogicConfiguration:0, digitalConfiguration:0, voipConfiguration:0, r17Index:0, group:null)
> id is set ? true
> name is set ? true
> duration max is set ? true
> {noformat}
> You can see that the last test for is set on the durationMax field return true, when it sould return false.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)