I get that (kind of), but in the sample you posted, when the call to "FileDescriptor fddd = fdl.get(dependencyList.get(i));" is made the is nothing in fdl because nothing was ever "put" onto it at that point. So like said either I am missing something or there is a step missing here...
final FileDescriptorSet fds = FileDescriptorSet.parseFrom(new FileInputStream(myFile)); // load the file however you feel appropriate - but close your streams : ) // special note - if you have custom options, you will need to create an ExtensionRegistry with them and use it while parsing the FileDescriptorSet try { Map<String, FileDescriptor> fdl = new HashMap<String, FileDescriptor>(); FileDescriptor current = null; for (FileDescriptorProto fdp : fds.getFileList()) { final List<String> dependencyList = fdp.getDependencyList(); final FileDescriptor[] fda = new FileDescriptor[dependencyList .size()]; for (int i = 0; i < fda.length; i++) { FileDescriptor fddd = fdl.get(dependencyList.get(i)); <- can't get something that is not there if (fddd == null) { // missing imports! - this should not happen unless you left off the --include_imports directive } else { fda[i] = fddd; } } current = FileDescriptor.buildFrom(fdp, fda); fdl.put(current.getName(), current); } // the "fdl" object now has all the descriptors - grab the one you need. } catch (DescriptorValidationException e) { // panic ? } On Oct 10, 3:06 pm, Benjamin Wright <compuware...@gmail.com> wrote: > Let's say you have message Card in file deck.proto .... > > Descriptor card = fdl.get("deck.proto").findMessage("Card"); > > DynamicMessage.parse (bytes, card) > > On Oct 10, 3:50 pm, Dale Durham <geny...@gmail.com> wrote: > > > > > > > > > OK, I think I may have missed a step here. Right now, I have: > > > 1) A file stream with the top level message descriptor - fds > > 2) A hash map with all the dependency descriptors - fdl > > > final FileDescriptorSet fds = FileDescriptorSet.parseFrom(new > > FileInputStream(myFile)); // load the file however you feel > > appropriate - but close your streams : ) > > // special note - if you have custom options, you will > > need to create an ExtensionRegistry with them and use it while > > parsing > > the FileDescriptorSet > > try { > > Map<String, FileDescriptor> fdl = new HashMap<String, > > FileDescriptor>(); > > FileDescriptor current = null; > > for (FileDescriptorProto fdp : fds.getFileList()) { > > final List<String> dependencyList = > > fdp.getDependencyList(); > > final FileDescriptor[] fda = new > > FileDescriptor[dependencyList > > .size()]; > > for (int i = 0; i < fda.length; i++) { > > FileDescriptor fddd = > > fdl.get(dependencyList.get(i)); > > if (fddd == null) { > > // missing imports! - this should not happen > > unless you left off the --include_imports directive > > } else { > > fda[i] = fddd; > > } > > } > > current = FileDescriptor.buildFrom(fdp, fda); > > fdl.put(current.getName(), current); > > } > > // the "fdl" object now has all the descriptors - grab > > the > > one you need. > > } catch (DescriptorValidationException e) { > > // panic ? > > } > > > How do I link of glue them all together? Do I loop through fdl and > > somehow add links in fds? > > > Thanks again, > > Dale > > > On Oct 10, 2:33 pm, Benjamin Wright <compuware...@gmail.com> wrote: > > > > You just need the descriptor for the top level message. It has the > > > links back to all the Contained types. That is why you needed the > > > descriptors of all of all the dependent files in order to build the > > > file descriptor. > > > > On Oct 10, 2:37 pm, Dale Durham <geny...@gmail.com> wrote: > > > > > Hi Benjamin, > > > > > Thanks again, I think that am very close now. I have the hash map with > > > > all the descriptors in it and I see that DynamicMessage has a > > > > parseFrom method that takes (Descriptor type, Byte[] data). So I can > > > > pass my messages byte stream in as the data, but cannot quite figure > > > > out what to pass for the 1st parameter since each message has 3 or > > > > more descriptors (all but one of which are dependency descriptors). I > > > > also do not see any "merge" capability in the class. > > > > > Can you (or anyone else) shed any light on how to do this when you get > > > > a chance? How do you give all of the descriptors to the > > > > DynamicMessage? > > > > > TIA, > > > > Dale > > > > > On Oct 10, 10:11 am, Benjamin Wright <compuware...@gmail.com> wrote: > > > > > > PS.. Just in case it want clear you should not need protoc for > > > > > anything after you have the descriptors. The Java protobuf library > > > > > can do all the dynamic parsing logic for you. > > > > > > On Oct 10, 11:03 am, Benjamin Wright <compuware...@gmail.com> wrote: > > > > > > > Dale: > > > > > > > I'm glad to be of help. You're definitely over thinking the > > > > > > problem. > > > > > > > File descriptor set- a protobuf describing one put more proto files. > > > > > > Contains file descriptor proto (s) > > > > > > > File descriptor proto- a protobuf describing a Single proto file > > > > > > > File descriptor-a java class containing the descriptor information > > > > > > for > > > > > > a proto file in a format usable by the dynamic message class and for > > > > > > other "reflection" over a proto message. These can be created by > > > > > > getting them from a compiled proto "root"class or built at run time > > > > > > from a file descriptor proto (how you're getting them). > > > > > > > Descriptor- a Java class that provides descriptor information for a > > > > > > particular message type that can be serialized or parsed. You get > > > > > > these from a file descriptor. > > > > > > > Dynamic message is a class provided to build and parse messages for > > > > > > which you have no compiled Java proto you must provide a > > > > > > descriptor > > > > > > to parse messages but not for serialization. > > > > > > > You should not need to parse from text unless the messages are > > > > > > passed > > > > > > as proto strings which would be an awful waste of bandwidth and > > > > > > performance. > > > > > > > i'm not in front of a computer (on my way home from a vacation) and > > > > > > I > > > > > > can't recall the exact method signatures but look at the dynamic > > > > > > message class closer. There should be a parse our build method that > > > > > > takes bytes or input stream, a descriptor (for a message type), and > > > > > > optionally an extension registry. If you jabber extensions to deal > > > > > > with let me know and I'll explain that better as It works > > > > > > differently > > > > > > in Java than in cpp. > > > > > > > :) good luck > > > > > > Sorry about grammar in places i'm on my phone.... That was a lot to > > > > > > type using Swype. > > > > > > > On Oct 10, 9:22 am, Dale Durham <geny...@gmail.com> wrote: > > > > > > > > Hi All, > > > > > > > > Again I am new to this, so please continue to bear with me and > > > > > > > thanks > > > > > > > to Benjamin Wright for all the help so far!! I think that I am > > > > > > > thinking myself into a circle between the FileDescriptors, > > > > > > > FileDescriptorSets, FileDescriptorProtos, and so on. It is not yet > > > > > > > really clear what is what between them all. > > > > > > > > So, with help from Benjamin, I can get all the base proto and > > > > > > > dependency file names and field names in one way or another. > > > > > > > Also, I > > > > > > > am creating the descriptors files "on the fly" if they do not > > > > > > > already > > > > > > > exist for each message type (I have not control over the messsages > > > > > > > being passed and cannot add the deccriptors to the messages > > > > > > > themselves). I am still fuzzy on if I should put all the fields > > > > > > > into > > > > > > > one Desriptor proto and pass that or all the files in one > > > > > > > DescriptorSet and pass that, or something else, but I'll figure > > > > > > > that > > > > > > > out eventually. > > > > > > > > Then I need to (or at least I THINK that I need to): > > > > > > > > 1) Create a new protobuf message based on the definition defined > > > > > > > for > > > > > > > the protobuf files and fields based on all the Descriptor and > > > > > > > dependency stuff above (I think this should be a DynamicMessage > > > > > > > based > > > > > > > on what I have seen and read) > > > > > > > 2) Do something similar to the C++ equivalent of > > > > > > > protobuf->ParseFromString(message.getData()); to deserialize and > > > > > > > get the byte > > > > > > > > array I have containing the actual message data into it > > > > > > > > I suspect that since there is protobuf no parsing in Java, I'll > > > > > > > have > > > > > > > to call out to protoc again, but if so am not sure what to pass > > > > > > > it or > > > > > > > even if my steps above are where I really need to go next. It may > > > > > > > be > > > > > > > that I need to iterate through each field, get it's type, and then > > > > > > > parse from the byte stream based on that iteration. > > > > > > > > I also wonder if it would be faster and easier to just create a > > > > > > > Java > > > > > > > version of the message based on the C++ version that I am being > > > > > > > passed > > > > > > > in the byte array and use that instead? > > > > > > > > The overall base steps I need to do are: > > > > > > > 1) Get a byte array containing protobuf message that was was > > > > > > > compiled > > > > > > > and serialized in C++ > > > > > > > 2) Get the structure of that message (base type and dependency > > > > > > > files > > > > > > > and fields in order and I can get this now, but not sure what I am > > > > > > > doing is optimal) > > > > > > > 3) Glue the message data into #2 above and display the it (again I > > > > > > > think this may require a protoc call out, but maybe not) > > > > > > > > Getting the files and fields is great and cool considering that I > > > > > > > just > > > > > > > started playing with these - not because I wanted to but because I > > > > > > > have to! Now I just want to be sure am doing it the best way and > > > > > > > need > > > > > > > to figure out how best to glue it all together. Most of the > > > > > > > examples I > > > > > > > can find assume the message was compiled for Java and that I know > > > > > > > the > > > > > > > type (the infamous Person Class in most of them) in advance and I > > > > > > > do > > > > > > > not. Any additional help or thoughts are appreciated. > > > > > > > > Thanks again, > > > > > > > Dale -- 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.