Why do your protocol message types have to map 1:1 with your legacy classes?
Generally, attempting to map inheritance onto Protocol Buffers doesn't work
very well.
You are right that you can use extensions, but unless you have a large
number of subclasses of OParameter, this isn't helpful. If the only
subclasses of OParameter are OStringParameter, OLongParameter, and
OListParameter, then I highly recommend defining OParameter as:
message OParameter {
// Only one of the following will be filled in.
optional int64 long_value = 1;
optional string string_value = 2;
repeated OParameter list_value = 3;
}
If you really wanted to use extensions instead, you could do:
message OParameter {
// Only one extension will be filled in.
extensions 1 to max;
}
extend OParameter {
optional int64 oparameter_long_value = 1;
optional string oparameter_string_value = 2;
repeated OParameter oparameter_list_value = 3;
}
This is logically equivalent to the first definition. The only difference
is logistical: you can define each extension field in a different .proto
file, and your program only needs to compile in the definitions of
extensions that it actually uses. So you can do:
// oparameter.proto
message OParameter {
// Only one extension will be filled in.
extensions 1 to max;
}
// olongparameter.proto
import oparameter.proto;
extend OParameter {
optional int64 oparameter_long_value = 1;
}
// ostringparameter.proto
import oparameter.proto;
extend OParameter {
optional string oparameter_string_value = 2;
}
// olistparameter.proto
import oparameter.proto;
extend OParameter {
repeated OParameter oparameter_list_value = 3;
}
But again, if you only have these three subclasses, then this is overkill.
If you actually have a lot more (say, at least 10), then it might be
worthwhile.
Again, keep in mind that extensions are not inheritance -- they are a very
different concept which happens to be able to solve similar problems.
On Wed, Aug 5, 2009 at 1:31 AM, Tai maitai.tru...@gmail.com wrote:
Hi Kenton,
Sorry the parameter classes are legacy code and persisted to the DB as
well. So I have to figure out what's the best approach defining my
proto classes.
What I see is that there is the way of using extensions in the proto
files. As far as I understand it is an extension of members (an not
classes) in another proto file. Correct?
So in my case the files in OStringParameterMessage.proto and
OLongParameterMessage.proto extends OParameterMessage.proto with a
member value of type string and int64.
The OListParameterMessage.proto then extends it with a member value of
type List (containing OParameterMessage.OParameter instances).
In the OListParameter.writeObject() I build OParameter messages. But
wouldn't there be a problem since the value is either of type String
or Quantity (depending on the subclass of OParameter)? Probably I have
to define different member names.
Tai
On 5 Aug., 03:05, Kenton Varda ken...@google.com wrote:
Can you just have the OParameter message contain optional fields of type
string and int64, where only one of the two is ever set? Then don't have
specific types corresponding to OStringParameter and OLongParameter.
On Tue, Aug 4, 2009 at 5:07 PM, Tai maitai.tru...@gmail.com wrote:
Hi,
I have an (abstract) class:
- OParameter with a member String key
Now there are also two subclasses of OParameter:
- OStringParameter with a member String value
- OLongParameter with a member long value
By using Protocol Buffers I define the proto files:
- OParameterMessage.proto
- OStringParameterMessage.proto
- OLongParameterMessage.proto
The files are independent from each other (no extension is used). As
far as I understand this is how Protocol Buffers should be used. All
classes (OParameter, OStringParameter and OLongParameter) then
implements the writeObject() and readObject() and each class just uses
their Protocol message and sets their members. Like:
- Class OStringParameter.writeObject() builds a message and sets only
its member (value)
- The superclass OParameter.writeObject() builds a message and sets
only its member (key)
The same goes for the readObject().
Okay. So far so good. But now I have a class called OListParameter and
its member (value) is a list of OParameter containing instances of
both types: OStringParameter and OLongParameter.
How do I describe this in a proto file?
Thanks Tai
--~--~-~--~~~---~--~~
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