public static void ExampleMain()
{
// This byte array is used for encoding and decoding, this is what you would send on the wire or save to disk
var byteBuffer = new byte[4096];
// You need to "wrap" the array with a DirectBuffer, this class is used by the generated code to read and write efficiently to the underlying byte array
var directBuffer = new DirectBuffer(byteBuffer);
const short baselineSchemaVersion = 0;
int bufferOffset = 0;
var baselineMessageHeader = new Baseline.MessageHeader();
var baselineCar = new Baseline.Car();
var extensionMessageHeader = new Extension.MessageHeader();
var extensionCar = new Extension.Car();
// Before encoding a message we need to create a SBE header which specify what we are going to encode (this will allow the decoder to detect that it's an encoded 'car' object)
// We will probably simplify this part soon, so the header gets applied automatically, but for now it's manual
baselineMessageHeader.Wrap(directBuffer, bufferOffset, baselineSchemaVersion); // position the MessageHeader on the DirectBuffer, at the correct position
baselineMessageHeader.BlockLength = Baseline.Car.BlockLength; // size that a car takes on the wire
baselineMessageHeader.SchemaId = Baseline.Car.SchemaId;
baselineMessageHeader.TemplateId = Baseline.Car.TemplateId; // identifier for the car object (SBE template ID)
baselineMessageHeader.Version = Baseline.Car.SchemaVersion; // this can be overridden if we want to support different versions of the car object (advanced functionality)
// Now that we have encoded the header in the byte array we can encode the car object itself
bufferOffset += Baseline.MessageHeader.Size;
Baseline.ExtensionExample.Encode(baselineCar, directBuffer, bufferOffset);
// Now we have encoded the message is the byte array, we are going to decode it
// first we decode the header (in a real world scenario you would need the header to decide which SBE decoder you are going to use
bufferOffset = 0;
// position the MessageHeader object at the beginning of the array
baselineMessageHeader.Wrap(directBuffer, bufferOffset, baselineSchemaVersion);
// Extract infos from the header
// In a real app you would use that to lookup the applicable flyweight to decode this type of message based on templateId and version.
int actingBlockLength = baselineMessageHeader.BlockLength;
int actingVersion = baselineMessageHeader.Version;
bufferOffset += Baseline.MessageHeader.Size;
// now we decode the message
Baseline.ExtensionExample.Decode(baselineCar, directBuffer, bufferOffset, actingBlockLength, actingVersion);
// Now let's check we can decode that as an extension
bufferOffset = Extension.MessageHeader.Size; // Start after the header
// schemaId = Extension.Car.SchemaId;
// extensionMessageHeader.Wrap(directBuffer, bufferOffset, extensionSchemaVersion);
// actingBlockLength = extensionMessageHeader.BlockLength;
// actingVersion = extensionMessageHeader.Version;
Extension.ExtensionExample.Decode(extensionCar, directBuffer, bufferOffset, actingBlockLength, actingVersion);
// And now let's encode an extension and decode it as baseline
Extension.ExtensionExample.Encode(extensionCar, directBuffer, Extension.MessageHeader.Size);
Baseline.ExtensionExample.Decode(baselineCar, directBuffer, (int)Baseline.MessageHeader.Size, (int)Extension.Car.BlockLength, (int)Baseline.Car.SchemaVersion);
}