代码之家  ›  专栏  ›  技术社区  ›  Harsh Shah

尝试从FlatBuffer的二进制文件访问“lengthoftable”时出现SystemAccessOutOfBound异常

  •  0
  • Harsh Shah  · 技术社区  · 6 年前

    我按照下面的模式存储数据。

    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.获取事件列表。

    2.访问单个事件结构。(我想得到的结果)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Aardappel    6 年前

    我在代码中看到两个问题:

    • 它丢失了一个 ListOfAttendee.clear() ,您的嵌套循环会导致此列表在每次迭代时变大。
    • 您正在将指针数据写入文件,而不是指针指向的文件(删除 & )