0

I have a schema:

namespace ExampleApp.Assets.Communications;

table FlatServerToClientMessage {
  messageid:string;
  imagebytes:[ubyte];
}

root_type FlatServerToClientMessage;

and for clarity, here is ServerToClientMessage.cs:

public class ServerToClientMessage : EventArgs
{
    public Guid MessageId { get; set; }
    public byte[] ImageBytes { get; set; }
}

I am trying to send, via TCP my ServerToClientMessage. This works fine when I use JSON, so it is not a problem somewhere else.

I have a FlatSerialize extension method which is supposed to serialize ServerToClientMessage and return a byte array. However, my buffer.Data is always empty... it is just full of zeros. My ServerToClientMessage does have data - it does have both a MessageId and ImageBytes.

Here is the serialize extension:

 public static byte[] FlatSerialize(this ServerToClientMessage message) {
   var builder = new FlatBufferBuilder(1);

   //Create an ID
   var MessageId = builder.CreateString(message.MessageId.ToString());

   //Start the vector...
   //Loop over each byte and add it - my god, is there not a better way?
   FlatServerToClientMessage.StartImagebytesVector(builder, message.ImageBytes.Length);
   foreach(var imageByte in message.ImageBytes) {
    builder.AddByte(imageByte);
   }
   var imagebytes = builder.EndVector();

   //Start the FlatServerToClientMessage and add the MessageId and imagebytes
   FlatServerToClientMessage.StartFlatServerToClientMessage(builder);
   FlatServerToClientMessage.AddMessageid(builder, MessageId);
   FlatServerToClientMessage.AddImagebytes(builder, imagebytes);

   //End the FlatServerToClientMessage and finish it...
   var flatMessage = FlatServerToClientMessage.EndFlatServerToClientMessage(builder);
   FlatServerToClientMessage.FinishFlatServerToClientMessageBuffer(builder, flatMessage);

   var buffer = builder.DataBuffer;
   return buffer.Data;
  }

Does anyone have any idea why my buffer.Data is just filled with zeros?

pookie
  • 3,796
  • 6
  • 49
  • 105

1 Answers1

2

Your buffer isn't empty, it just doesn't start at offset 0 in Data (FlatBuffers are built back to front), it starts at Offset. You can access the bytes from there on. Alternatively, you can call FlatBufferBuilder.SizedByteArray() to create a byte array that has only the FlatBuffer data.

Aardappel
  • 5,559
  • 1
  • 19
  • 22