Handling Nulls¶
Variable Length Strings¶
Null strings encoded using a variable length string encoder are returned as empty strings. The sample nullStringReturnsAsEmptyString
shows the effect in action.
encoder.message2(null);
//decode
Assertions.assertEquals("", decoder.message2());
Numbers¶
Number fields do not support nulls, however a magic number can be assigned to represent null. If you do not provide one, SBE uses a default value. If null is required, the generated xxxxNullValue
can be used. Then, when reading, convert the generated Null value back to null.
Here's an example defining a null magic number as 33; of course you would need to select a valid value for your particular usage:
<composite name="composite" description="Sample Composite type">
<type name="field1" primitiveType="uint16" nullValue="33"/>
</composite>
You can retrieve the magic number for a field via the NullValue method, for example:
CompositeDecoder.field1NullValue()
Repeating Groups¶
Working with repeating groups is simple for both encoding and decoding data.
Encoding¶
- First, declare the group size
- For each item in the group:
- Iterate to the next item
- Apply values.
final SampleGroupEncoder encoder = new SampleGroupEncoder();
final MessageHeaderEncoder messageHeaderEncoder = new MessageHeaderEncoder();
final ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
final UnsafeBuffer directBuffer = new UnsafeBuffer(byteBuffer);
encoder.wrapAndApplyHeader(directBuffer, 0, messageHeaderEncoder);
encoder.timestamp(1000L);
SampleGroupEncoder.GroupEncoder groupEncoder = encoder.groupCount(2);
groupEncoder.next();
groupEncoder.groupField1(1);
groupEncoder.groupField2(2);
groupEncoder.groupField3(MESSAGE_2);
groupEncoder.next();
groupEncoder.groupField1(1);
groupEncoder.groupField2(2);
groupEncoder.groupField3(MESSAGE_2);
encoder.message(MESSAGE_1);
Decoding¶
The decoder generates an Iterable
, which makes group processing simpler.
final SampleGroupDecoder decoder = new SampleGroupDecoder();
final MessageHeaderDecoder headerDecoder = new MessageHeaderDecoder();
int bufferOffset = 0;
headerDecoder.wrap(directBuffer, bufferOffset);
...
bufferOffset += headerDecoder.encodedLength();
decoder.wrap(directBuffer, bufferOffset, actingBlockLength, actingVersion);
assertEquals(1000L, decoder.timestamp());
for (final SampleGroupDecoder.GroupDecoder groupDecoder : decoder.group())
{
assertEquals(1, groupDecoder.groupField1());
assertEquals(2, groupDecoder.groupField2());
assertEquals(MESSAGE_2, groupDecoder.groupField3());
}
assertEquals(MESSAGE_1, decoder.message());
See canWriteReadSampleRepeatGroups
in the sample.