For my use case, serializing optional-with-default fields when they're unset wastes a huge amount of disk space. The behavior I expected was that optional fields would not be serialized unless they are explicitly set, and I was surprised to discover that in Java at least this isn't always the case.
As Bryan Duxbury mentioned above, whether or not an optional-with-default-value field is serialized in Java actually depends on the datatype of the field. Consider this struct, for example:
1: optional bool a = true,
2: optional byte b = 4,
3: optional i16 c = 12,
4: optional i32 d = 49303,
5: optional i64 e = 584393,
6: optional double f = 5.5,
7: optional string g = "some value"
When I instantiate a plain A object and don't set any fields on it and write it using TJSONProtocol, I get
This is a horribly counterintuitive behavior. Either all of those fields should be serialized, or none of them should be.
My vote is that we regularize this behavior and then make it controllable via a thrift compiler flag, e.g. thrift --serialize-unset-optionals-with-default=[true|false]