hi Kenton:
  I need your help,This problem has been bothering me for many days.

In c++ server ,code like this 
capnp::MallocMessageBuilder message;
FullInfo::Builder fullInfo = message.initRoot<FullInfo>();
fullInfo.setGoodsId(919731)

kj::ArrayPtr<const kj::ArrayPtr<const capnp::word>> segments 
= message.getSegmentsForOutput();
kj::ArrayPtr<const capnp::word> segment = segments[0];
kj::ArrayPtr<const char> chars = segment.asChars();
const char* mem_buf = chars.begin();
int32_t mem_buf_len = chars.size();

and c++ server send the mem_buf to java_client by rpc call(bytes field)

*Client and server communicate through protobuf rpc*

In java_client code like this:() 

com.google.protobuf.ByteString capn_object_bytes =  
 response.getCapnObject();
ByteBuffer[] bytes_buffer = new ByteBuffer[1];
bytes_buffer[0] = capn_object_bytes.asReadOnlyByteBuffer();
MessageReader message = new MessageReader(bytes_buffer, 
ReaderOptions.DEFAULT_READER_OPTIONS);
Display.FullInfo.Reader fullInfo  = 
message.getRoot(Display.FullInfo.factory);
System.out.println("goodsId:" + fullInfo.getGoodsId());

but in java_client ,print goodsId is 0, however in c++ server, I  
setGoodsId(919731) ,What's wrong with my method of use? @Kenton

the fullinfo.capnp code is:
@0xcb70f505c89d1634;

using Java = import "./compiler/src/main/schema/capnp/java.capnp";
$Java.package("org.capnproto.examples");
$Java.outerClassname("Display");

struct FullInfo{
    goodsId @1 :Int64;
 }





在 2019年10月1日星期二 UTC+8上午3:23:37,Kenton Varda写道:
>
> Are you transmitting one big buffer containing all the segments, or are 
> you transmitting each segment separately?
>
> It looks like you're trying to do the latter, but in that case you cannot 
> use Serialize.read() to read it. You need to use `new 
> MessageReader(segments)`.
>
> -Kenton
>
> On Mon, Sep 30, 2019 at 5:52 AM 张小 <[email protected] <javascript:>> wrote:
>
>> First Time:
>>  In C++ server,I Use capnp::DynamicStruct, code like this:
>> capnp::MallocMessageBuilder msg;
>> capnp::DynamicStruct::Builder fullinfo_builder 
>> = msg.initRoot<capnp::DynamicStruct>(g_schema);
>> capnp::DynamicStruct::Builder fullInfo =  
>> msg.initRoot<capnp::DynamicStruct>(g_schema);
>>
>> capnp::messageToFlatArray(msg);  ---->convert it to char* send to 
>> java_cliet
>>
>> Java Client ,code like this:
>> MessageReader message 
>> = org.capnproto.Serialize.read(capn_object_bytes.asReadOnlyByteBuffer());,
>> Info.Reader adInfo = message.getRoot(Info.factory);
>>
>> Above , My First Time do work , but The Second Time, I do like this ,it 
>> do not work:
>>  In C++ server, code like this:
>>
>> capnp::MallocMessageBuilder message;
>> Info::Builder info = message.initRoot<Info>();
>> info.setId(123);
>> kj::ArrayPtr<const kj::ArrayPtr<const capnp::word>> segments = 
>> message.getSegmentsForOutput();
>>
>> then I convert the  segments  object to char* send to java_client by 
>> proto rpc_call (bytes field)
>>
>>
>> Java Client ,code like this:
>> MessageReader message 
>> = org.capnproto.Serialize.read(capn_object_bytes.asReadOnlyByteBuffer());,
>> Info.Reader adInfo = message.getRoot(Info.factory);
>>
>>
>> In Second Time, happen Error like this:
>>
>> Exception in thread "main" java.lang.IllegalArgumentException
>> at java.nio.Buffer.limit(Buffer.java:275)
>> at org.capnproto.Serialize.read(Serialize.java:140)
>> at org.capnproto.Serialize.read(Serialize.java:111)
>>
>> How Can I do , In Second Time ,thanks 
>>
>>
>>
>>
>>
>>
>> 在 2019年9月30日星期一 UTC+8下午8:29:41,David Renshaw写道:
>>>
>>> On the Java side, you need to first read the bytes into a 
>>> `MessageReader`. That's typically done via one of the `Serialize.read()` 
>>> methods.
>>>
>>> The `AnyPointer.Reader()` is not intended for external use. Probably we 
>>> should make it private.
>>>
>>>
>>> On Mon, Sep 30, 2019 at 6:25 AM 张小 <[email protected]> wrote:
>>>
>>>> C++ server send Capn Object to JavaClient like this
>>>>
>>>> capnp::MallocMessageBuilder message;
>>>> Info::Builder info = message.initRoot<Info>();
>>>> info.setId(123);
>>>> kj::ArrayPtr<const kj::ArrayPtr<const capnp::word>> segments = 
>>>> message.getSegmentsForOutput();
>>>>
>>>> then I convert the  segments  object to char* send to java_client by 
>>>> proto rpc_call (bytes field)
>>>>
>>>>
>>>> Then In java_client, I do like this to read the capn object
>>>> com.google.protobuf.ByteString capn_object_bytes =  
>>>>  response.getCapnObject()
>>>> SegmentReader segment = new 
>>>> SegmentReader(capn_object_bytes.asReadOnlyByteBuffer(), null);
>>>> AnyPointer.Reader any = new AnyPointer.Reader(segment, 0, 64*1024*1024);
>>>> Info.Reader info = any.getAs(Info.factory);
>>>> System.out.println("Id:" + info.getId());
>>>>
>>>>
>>>> run java_cliet ,happend error like this :
>>>> Exception in thread "main" java.lang.NullPointerException
>>>> at org.capnproto.WireHelpers.readStructPointer(WireHelpers.java:918)
>>>> at 
>>>> org.capnproto.StructFactory.fromPointerReaderRefDefault(StructFactory.java:34)
>>>> at org.capnproto.StructFactory.fromPointerReader(StructFactory.java:41)
>>>> at org.capnproto.StructFactory.fromPointerReader(StructFactory.java:24)
>>>> at org.capnproto.AnyPointer$Reader.getAs(AnyPointer.java:56)
>>>>
>>>>
>>>>
>>>>
>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Cap'n Proto" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to [email protected].
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/capnproto/081ab20b-5eae-43d5-a4fc-8230ef39d4a5%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/capnproto/081ab20b-5eae-43d5-a4fc-8230ef39d4a5%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Cap'n Proto" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/capnproto/816c3227-c2b2-4b72-8ead-e707759a257c%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/capnproto/816c3227-c2b2-4b72-8ead-e707759a257c%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/capnproto/1e177ff5-e49f-4d4a-b5f3-1c096604bb29%40googlegroups.com.

Reply via email to