Я только начинаю экспериментировать с cap’n proto и пытаюсь улучшить мое понимание.
Прямо сейчас я пытаюсь понять, как лучше использовать AnyPointer, и во время экспериментов я заметил, что мне не нужно вызывать initAs для моего объекта, и значения, которые я установил, будут прочитаны правильно.
Это моя схема для корневого контейнера, который имеет какой-либо объект структуры
struct TestObject
{
value1 @0 : Int32 = -5;
value2 @1 : Float32 = 9.4;
}
struct TestContainer
{
object @0: AnyPointer;
}
Когда я начинаю сериализовывать некоторые объекты, мне кажется, что не имеет значения, использую ли я initAs или getAs.
::capnp::MallocMessageBuilder message;
auto container= message.initRoot<TestContainer>();
auto anything = container.initObject();
auto objectBuilder = anything.getAs<TestObject>(); //I was expecting this to break since nothing obviously initialises it.
objectBuilder.setValue1( -2099 );
objectBuilder.setValue2( -3.994f );
//using initAs works as well
auto anything = container.initObject();
auto objectBuilder = anything.initAs<TestObject>();
objectBuilder.setValue1( 270001 );
objectBuilder.setValue2( -65.2f );
Когда я снова десериализуюсь, я получаю правильные значения от любого из вышеупомянутых методов. Правильно ли здесь использовать getAs или более сложный TestObject сломает вещи?
С сайта Cap’n Proto
https://capnproto.org/cxx.html#structs
getBar (): для примитивов возвращает значение. Для композитов возвращает
Строитель для композита. Если составное поле не было
инициализирован (то есть это первый раз, когда к нему обращались), он
будет инициализирован до копии значения поля по умолчанию до
возвращение.
Так что да — вам не нужно вызывать init {field} (), но вы можете просто вызвать get {field} () для любого типа структуры, а не только AnyPointer.
Вы должны вызвать init {field}, хотя это список.
Других решений пока нет …