SystemAccessOutOfbound Исключение при попытке доступа к «LengthofTable» из двоичного файла flatbuffer - PullRequest
0 голосов
/ 30 января 2019

Я храню свои данные в соответствии со следующей схемой.

namespace iCalendarParser;

table EventParsed {

UID:string;
Organizer:string;
Summary:string;
Description:string;
Attendee:[string];
Categories:string;
DtEnd:string;
DtStart:string;
DtStamp:string;
AttendeeCounter:short;

}

table TableofEvents{

  events:[EventParsed];

}

root_type TableofEvents;

Я храню подобные данные в моем приложении c ++.

   std::vector<flatbuffers::Offset<flatbuffers::String>> ListOfAttendee;
   std::vector<flatbuffers::Offset<iCalendarParser::EventParsed>> ListofEvents;



    for (auto EventList : ListofAllEvents)
    {

auto Organizer = builder.CreateString(EventList->Organizer);
auto UID = builder.CreateString(EventList->UID);
auto DtStart = builder.CreateString(EventList->DtStart);
auto DtEnd = builder.CreateString(EventList->DtEnd);
auto DtStamp = builder.CreateString(EventList->DtStamp);
auto Summary = builder.CreateString(EventList->Summary);
auto Description = builder.CreateString(EventList->Description);
auto Categories = builder.CreateString(EventList->Categories);

for (int i = 0; i < EventList->AttendeeCounter; i++)
{
    ListOfAttendee.push_back(builder.CreateString(EventList->Attendee[i]));

}


auto VectorListofAttendee = builder.CreateVector(ListOfAttendee);

auto CreatEventInFlatBuffer = CreateEventParsed(builder, UID, Organizer, Summary, Description, VectorListofAttendee, Categories, DtEnd, DtStart, DtStamp, EventList->AttendeeCounter);

ListofEvents.push_back(CreatEventInFlatBuffer);

 }

 auto CreatVectorOfEventInFlatbuffer = builder.CreateVector(ListofEvents);
 auto InsertEventInFlatBufferList = CreateTableofEvents(builder, 
 CreatVectorOfEventInFlatbuffer);
 builder.Finish(InsertEventInFlatBufferList);

 uint8_t *buf = builder.GetBufferPointer();
 int size = builder.GetSize();

 std::ofstream ofile("icalBin.bin", std::ios::binary);
 ofile.write((char *)&buf, size);
 ofile.close();

Из моего приложения C # я пытаюсь получить доступ к десериализации данных.

byte[] ReadbytesfromFile = File.ReadAllBytes("icalBin.bin");
var buffer = new ByteBuffer(ReadbytesfromFile);
var tableofEvents = TableofEvents.GetRootAsTableofEvents(buffer); 
int len = tableofEvents.EventsLength;

Не могу понять, что не так.Может кто-нибудь сказать мне, как я могу получить доступ к вложенным таблицам в соответствии со схемой и десериализовать в C #.

Общая идея:

1.Получить listofevents.

2.Доступ к отдельным структурам событий,(Результат я пытаюсь получить)

1 Ответ

0 голосов
/ 30 января 2019

Я вижу 2 проблемы в вашем коде:

  • Отсутствует ListOfAttendee.clear(), ваши вложенные циклы увеличивают этот список на каждой итерации.
  • Вы пишетеданные указателя на файл, а не то, на что указывает указатель (удалите &).
...