0

我刚刚开始尝试使用 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 会破坏事情?

4

1 回答 1

0

来自 Cap'n Proto 的网站 https://capnproto.org/cxx.html#structs

getBar():对于原语,返回值。对于组合,返回组合的 Builder。如果复合字段尚未初始化(即这是第一次访问它),则在返回之前将其初始化为该字段默认值的副本。

所以是的 - 您不必调用 init{field}(),但可以为任何结构类型调用 get{field}(),而不仅仅是 AnyPointer。

当它是一个列表时,你必须调用 init{field} 。

于 2017-07-14T15:55:17.520 回答