hi Kenton Varda
*  when I do this:*
   kj::ArrayPtr<const kj::ArrayPtr<const capnp::word>> segments = message.
getSegmentsForOutput();

  the segments size Always 1,so in protobuf I use bytes field to send the 
segments[0].asChars();

*Is there any problem in using it like this*



   在 2019年10月8日星期二 UTC+8上午12:31:10,Kenton Varda写道:
>
> messageToFlatArray() involves an extra copy compared to 
> getSegmentsForOutput().
>
> However, you are putting the bytes into a protobuf anyway. Protobuf will 
> make many copies. So I don't think you should worry too much about this one 
> extra copy.
>
> If you really want to use getSegmentsForOutput(), then you need to use a 
> `repeated bytes` field in protobuf and you need to add each segment to the 
> repeated bytes.
>
> -Kenton
>
> On Sun, Oct 6, 2019 at 8:00 PM 张小 <[email protected] <javascript:>> wrote:
>
>>  hi Kenton:
>>     getSegmentsForOutput() performance better than messageToFlatArray 
>> right?  These two interfaces  What scenarios are applied to?
>>
>>   best wish
>>   whutbd
>>
>> 在 2019年10月7日星期一 UTC+8上午3:41:23,Kenton Varda写道:
>>>
>>> Your code only handles the case of a single segment. I recommend using 
>>> the methods in capnp/serialize.h and org.capnproto.Serialize. I do not 
>>> recommend using getSegmentsForOutput() nor constructing a MessageReader 
>>> directly from a segment array, as these are advanced functions that can 
>>> more easily go wrong.
>>>
>>> That said, in your example case, only a single segment should be needed, 
>>> so something else is wrong too.
>>>
>>> I don't see any other obvious problems with the code you provided. I 
>>> suspect a bug exists in the code you didn't show. I recommend you try to 
>>> verify that the bytes on the receiving end are actually exactly the bytes 
>>> from the sending end. Try logging the byte values and the size of the 
>>> segment at each end to make sure everything matches.
>>>
>>> I think the most likely problem is that somewhere your `char*` is being 
>>> interpreted as a NUL-terminated string, and is therefore being truncated at 
>>> the first zero-valued byte. Most likely, the very first byte in the segment 
>>> is a zero, so probably your ByteBuffer on the Java end ends up being 
>>> zero-length. This probably leads to the struct appearing to contain only 
>>> default values, hence goodsId is 0.
>>>
>>> -Kenton
>>>
>>> On Sat, Oct 5, 2019 at 11:28 PM 张小 <[email protected]> wrote:
>>>
>>>> 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]> 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].
>>>>>> 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
>>>>  
>>>> <https://groups.google.com/d/msgid/capnproto/1e177ff5-e49f-4d4a-b5f3-1c096604bb29%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/222eed4a-8f6a-48e7-828e-09235b228253%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/capnproto/222eed4a-8f6a-48e7-828e-09235b228253%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/fa2451ad-4441-4c3a-8af0-39a9b45cb7c9%40googlegroups.com.

Reply via email to