Недостающие помощники для создания вектора структур в Java - PullRequest
1 голос
/ 09 января 2020

Давайте в качестве примера рассмотрим следующую схему FlatBuffer:

struct Ipv6 {
    b0: byte;
    b1: byte;
    b2: byte;
    b3: byte;
    b4: byte;
    b5: byte;
    b6: byte;
    b7: byte;
    b8: byte;
    b9: byte;
    b10: byte;
    b11: byte;
    b12: byte;
    b13: byte;
    b14: byte;
    b15: byte;
}

table Ipv6List {
    entries: [Ipv6];
}

root_type Ipv6List;

У меня проблема с созданием вектора, который содержит Ipv6 структур. Java класс Ipv6List, сгенерированный Flatbuffer 1.11.0 , не включает в себя обычный create помощник. Читая документацию, кажется, что это выбор дизайна для повышения производительности за счет предотвращения создания временного объекта.

Если посмотреть на другие методы, есть функция Ipv6List#startEntriesVector stati c, но нет связанных addX и endX функций. Вот что я пытаюсь сделать:

FlatBufferBuilder builder = new FlatBufferBuilder();

final byte[] inetAddressBytes =
        Inet6Address.getByName("2a01:e35:2e7a:490:6193:c54c:f740:f907").getAddress();

int ipv6Offset = Ipv6.createIpv6(builder,
        inetAddressBytes[0], inetAddressBytes[1], inetAddressBytes[2], inetAddressBytes[3],
        inetAddressBytes[4], inetAddressBytes[5], inetAddressBytes[6], inetAddressBytes[7],
        inetAddressBytes[8], inetAddressBytes[9], inetAddressBytes[10], inetAddressBytes[11],
        inetAddressBytes[12], inetAddressBytes[13], inetAddressBytes[14], inetAddressBytes[15]
);

Ipv6List.startEntriesVector(builder, 1);

// how to add the IP to the vector ?
// how to end the association and get the vector offset ?
// int ipsVectorOffset = ?;

int ipListOffset = Ipv6List.createIpv6List(builder, ipsVectorOffset);
builder.finish(ipListOffset);
ByteBuffer byteBuffer = builder.dataBuffer();

Есть идеи, как создать вектор структуры Ipv6 и связать его со списком?

1 Ответ

1 голос
/ 09 января 2020

Структуры всегда нужно создавать встроенными, поэтому порядок операций должен быть:

Ipv6List.startEntriesVector(builder, 1);
Ipv6.createIpv6(builder,..);
o = builder.endVector();
Ipv6List.createIpv6List(builder, o);
...