Re: [protobuf] Documentation Riddle

2018-09-26 Thread Josh Humphries
On Wed, Sep 26, 2018 at 3:42 AM omid pourhadi 
wrote:

> I have some questions :
>
> 1. Is it a good idea to use Any for transferring a serialized/deserialized
> java object from client to server for example consider this ?
>

A google.protobuf.Any encapsulates a *protobuf message *whose type can
vary, not an arbitrary type from an arbitrary language. So, no, you can't
use it to represent a serialized Java object because you won't have a valid
type URL for that object. The type URL is meant to refer to a protobuf type.

Instead, you would need to use bytes. Or you could create your own type
that is similar to Any:

message Object {
string type = 1;
bytes value = 2;
}

Other options are to use google.protobuf.Struct, but that is limited to
what can be represented by a JSON object. If your Java objects have a
canonical JSON representation then this might be a useful solution.

The final alternative is to create your own set of generic messages, very
similar to the types in "google/protobuf/struct.proto" but for modeling
Java objects in a higher-fidelity manner than just as serialized bytes.


>
> import "google/protobuf/empty.proto";
> import "google/protobuf/any.proto";
> import "google/protobuf/type.proto";
>
> service AcceptorService {
>   rpc search(google.protobuf.Any) returns (google.protobuf.ListValue) {};
>
> }
>
> 2. How can I use ListValue ?
>

The google.protobuf.ListValue type can only represent the same category of
values that you can represent with a JSON Array. So it can't represent a
list of strongly-typed values. (Instead, the best you could do is a list of
google.protobuf.Struct to represent a List). So if you instead are
trying to represent a Java List, you'd be better off creating your
own type:

message ListOfObject {
// this example uses bytes, serialized Java objects, as the values
// but could reference other types as mentioned above for how you
// might represent an arbitrary Java object in protobuf
repeated bytes objects = 1;
}

You could then serialize Java objects into elements of the objects field.


>
> 3. How can I define a Map in a message (I found
> MapOfObjects in maps.proto but it is using string)?
>

I don't know what maps.proto is. Perhaps you are working with a set of
message types where someone else has already tried to model much of your
Java domain objects already? Anyhow, you'd need to do something like
mentioned above: map where values are serialized Java
objects (or some other value type, based on how you decide to model an
arbitrary Java object).

FWIW, a generally better idea is to limit the domain of what kind of object
can be transferred and model all of them as messages in proto. That would
allow you to use google.protobuf.Any instead of bytes. You could then
define your list and maps as:

message dummy {
repeated google.protobuf.Any list = 1;
map map = 2;
}

Note however that maps in protobuf are limited to integral, bool, and
string keys: you cannot use messages or bytes values as the key for a
protobuf map (unlike in Java, where anything can be a map key). If you have
a data structure like that in Java, you'd instead have to model it like so:

// this example is for Map
message MapObjectStringEntry {
google.protobuf.Any key = 1;
string value = 2;
}

message dummy {
repeated MapObjectStringEntry map = 1;
}

Hope this helps. Good luck.


> message dummy{
>  map filters = 1;
> }
>
> Thanks in advanced
>
> --
> You received this message because you are subscribed to the Google Groups
> "Protocol Buffers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to protobuf+unsubscr...@googlegroups.com.
> To post to this group, send email to protobuf@googlegroups.com.
> Visit this group at https://groups.google.com/group/protobuf.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to protobuf+unsubscr...@googlegroups.com.
To post to this group, send email to protobuf@googlegroups.com.
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.


[protobuf] Documentation Riddle

2018-09-26 Thread omid pourhadi
I have some questions :

1. Is it a good idea to use Any for transferring a serialized/deserialized 
java object from client to server for example consider this ? 

import "google/protobuf/empty.proto";
import "google/protobuf/any.proto";
import "google/protobuf/type.proto";

service AcceptorService { 
  rpc search(google.protobuf.Any) returns (google.protobuf.ListValue) {};  
  
}

2. How can I use ListValue ?

3. How can I define a Map in a message (I found 
MapOfObjects in maps.proto but it is using string)?

message dummy{
 map filters = 1;
}

Thanks in advanced

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to protobuf+unsubscr...@googlegroups.com.
To post to this group, send email to protobuf@googlegroups.com.
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.