[protobuf] Re: Trouble sending String representation of GPB from Java to C++
Just to follow on the off chance that someone as stupid as myself might be facing a similar issue in the future. As you implied in in your first response, using GPB Text Format on the producing side ( which amounts to calling toString() ) and a C++ TextFormat on the consuming side will indeed work. This code writes, and reads corresponding GPB text representations repectively. 1) To illustrate with a code snippet (Java producer) TextMessage tm = session.createTextMessage(); //JMS tm.setText(person.toString()); //person is a GPB 2) On the consuming side ( in C++ ) TextFormat:parseFromString(dataString, &person); Where "dataString" is the TextMessage payload, successfully creates a c ++ person. Simplest thing should have heen tried first. Thanks On Oct 6, 2:28 pm, Jason Hsueh wrote: > On Thu, Oct 6, 2011 at 11:17 AM, Jerry wrote: > > Thanks for the quick response Jason. Just to be clear, are you saying > > that I will not be able to send a String representation from Java to C+ > > + and expect it to work. > > AFAIK, String coerces text into UTF (I am not a Java guy) so no, you cannot > do this. You'd need to use the raw byte array from the ByteString. The > String may be an invalid protobuf encoding, meaning it will fail for any > protobuf decoder. Java to Java will not work either - the UTF conversion is > lossy so the other side cannot recover the original protobuf encoding. > > > > > > > In term of the sending code: > > --- > > String text = person.toByteString().toStringUtf8(); > > //or toString(charsetName) > > TextMessage tm = session.createTextMessage(); > > tm.setText (text); > > //send > > -- > > > 1) Once received the text payload will NOT be able to be used to > > create a Person on the C++ side using Message::ParseFromString() ? > > Or is it just that the above code is inncorrect? Could I use a > > different charset? > > > 2) However, the above code would work to send GPBs from Java to Java > > as String representations over JMS for example, correct? > > > On Oct 6, 1:03 pm, Jason Hsueh wrote: > > > On Thu, Oct 6, 2011 at 9:49 AM, Jerry wrote: > > > > Simple ( hopefully ) question. I am sending a protocol buffer message > > > > from windows over EMS to a C++ process that is running on linux. The > > > > text payload is generated as follows on my windows system: > > > > > person.toByteString().toStringUtf8(). > > > > Serialized protos are not valid UTF8, and you should never operate on > > them > > > as Java String objects. You'll get data corruption on the other side, > > making > > > it unparsable. > > > > > When the c++ side attempts to reanimate my person with the following > > > > code: > > > > > google:protobuf::TextFormat:parseFromString(dataString, &person); > > > > You used the binary format above, but are using the text format here. You > > > should be using Message::ParseFromString() or a similar variant; > > TextFormat > > > should be paired with the Java TextFormat class. > > > > > The following error is produced: > > > > > "Invalid control characters encountered in text" > > > > > Any help would be greatly appreciated. > > > > > Also, for reasons that are beside the point I am unable to send a > > > > bytes[] between processes at this time. > > > > > Thanks > > > > -Jerry > > > > > -- > > > > You received this message because you are subscribed to the Google > > Groups > > > > "Protocol Buffers" group. > > > > To post to this group, send email to protobuf@googlegroups.com. > > > > To unsubscribe from this group, send email to > > > > protobuf+unsubscr...@googlegroups.com. > > > > For more options, visit this group at > > > >http://groups.google.com/group/protobuf?hl=en.-Hide quoted text - > > > > - Show quoted text - > > > -- > > You received this message because you are subscribed to the Google Groups > > "Protocol Buffers" group. > > To post to this group, send email to protobuf@googlegroups.com. > > To unsubscribe from this group, send email to > > protobuf+unsubscr...@googlegroups.com. > > For more options, visit this group at > >http://groups.google.com/group/protobuf?hl=en.- Hide quoted text - > > - Show quoted text - -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to protobuf@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.
Re: [protobuf] Re: Trouble sending String representation of GPB from Java to C++
On Thu, Oct 6, 2011 at 11:17 AM, Jerry wrote: > Thanks for the quick response Jason. Just to be clear, are you saying > that I will not be able to send a String representation from Java to C+ > + and expect it to work. > AFAIK, String coerces text into UTF (I am not a Java guy) so no, you cannot do this. You'd need to use the raw byte array from the ByteString. The String may be an invalid protobuf encoding, meaning it will fail for any protobuf decoder. Java to Java will not work either - the UTF conversion is lossy so the other side cannot recover the original protobuf encoding. > > In term of the sending code: > --- > String text = person.toByteString().toStringUtf8(); > //or toString(charsetName) > TextMessage tm = session.createTextMessage(); > tm.setText (text); > //send > -- > > 1) Once received the text payload will NOT be able to be used to > create a Person on the C++ side using Message::ParseFromString() ? > Or is it just that the above code is inncorrect? Could I use a > different charset? > > 2) However, the above code would work to send GPBs from Java to Java > as String representations over JMS for example, correct? > > > On Oct 6, 1:03 pm, Jason Hsueh wrote: > > On Thu, Oct 6, 2011 at 9:49 AM, Jerry wrote: > > > Simple ( hopefully ) question. I am sending a protocol buffer message > > > from windows over EMS to a C++ process that is running on linux. The > > > text payload is generated as follows on my windows system: > > > > > person.toByteString().toStringUtf8(). > > > > Serialized protos are not valid UTF8, and you should never operate on > them > > as Java String objects. You'll get data corruption on the other side, > making > > it unparsable. > > > > > > > > > When the c++ side attempts to reanimate my person with the following > > > code: > > > > > google:protobuf::TextFormat:parseFromString(dataString, &person); > > > > You used the binary format above, but are using the text format here. You > > should be using Message::ParseFromString() or a similar variant; > TextFormat > > should be paired with the Java TextFormat class. > > > > > > > > > > > > > The following error is produced: > > > > > "Invalid control characters encountered in text" > > > > > Any help would be greatly appreciated. > > > > > Also, for reasons that are beside the point I am unable to send a > > > bytes[] between processes at this time. > > > > > Thanks > > > -Jerry > > > > > -- > > > You received this message because you are subscribed to the Google > Groups > > > "Protocol Buffers" group. > > > To post to this group, send email to protobuf@googlegroups.com. > > > To unsubscribe from this group, send email to > > > protobuf+unsubscr...@googlegroups.com. > > > For more options, visit this group at > > >http://groups.google.com/group/protobuf?hl=en.- Hide quoted text - > > > > - Show quoted text - > > -- > You received this message because you are subscribed to the Google Groups > "Protocol Buffers" group. > To post to this group, send email to protobuf@googlegroups.com. > To unsubscribe from this group, send email to > protobuf+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/protobuf?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to protobuf@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.
[protobuf] Re: Trouble sending String representation of GPB from Java to C++
Thanks for the quick response Jason. Just to be clear, are you saying that I will not be able to send a String representation from Java to C+ + and expect it to work. In term of the sending code: --- String text = person.toByteString().toStringUtf8(); //or toString(charsetName) TextMessage tm = session.createTextMessage(); tm.setText (text); //send -- 1) Once received the text payload will NOT be able to be used to create a Person on the C++ side using Message::ParseFromString() ? Or is it just that the above code is inncorrect? Could I use a different charset? 2) However, the above code would work to send GPBs from Java to Java as String representations over JMS for example, correct? On Oct 6, 1:03 pm, Jason Hsueh wrote: > On Thu, Oct 6, 2011 at 9:49 AM, Jerry wrote: > > Simple ( hopefully ) question. I am sending a protocol buffer message > > from windows over EMS to a C++ process that is running on linux. The > > text payload is generated as follows on my windows system: > > > person.toByteString().toStringUtf8(). > > Serialized protos are not valid UTF8, and you should never operate on them > as Java String objects. You'll get data corruption on the other side, making > it unparsable. > > > > > When the c++ side attempts to reanimate my person with the following > > code: > > > google:protobuf::TextFormat:parseFromString(dataString, &person); > > You used the binary format above, but are using the text format here. You > should be using Message::ParseFromString() or a similar variant; TextFormat > should be paired with the Java TextFormat class. > > > > > > > The following error is produced: > > > "Invalid control characters encountered in text" > > > Any help would be greatly appreciated. > > > Also, for reasons that are beside the point I am unable to send a > > bytes[] between processes at this time. > > > Thanks > > -Jerry > > > -- > > You received this message because you are subscribed to the Google Groups > > "Protocol Buffers" group. > > To post to this group, send email to protobuf@googlegroups.com. > > To unsubscribe from this group, send email to > > protobuf+unsubscr...@googlegroups.com. > > For more options, visit this group at > >http://groups.google.com/group/protobuf?hl=en.- Hide quoted text - > > - Show quoted text - -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to protobuf@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.