I've got the server written just fine, and can run it up and send hand-
encoded messages to it and it does the right thing. I've just started
writing some simple functional tests as python scripts, generated
using the same .proto file as the java code, but I can't see how to do
WriteDelimited/ParseDelimited (or the equivilent of) in the Python
API. Is there a way of doing this? And if so, what am I missing? :)
Cheers
--
Graham Cox
--
You received this message because you are subscribed to the Google Groups "Protocol Buffers" group.
To post to this group, send email to prot...@googlegroups.com.
To unsubscribe from this group, send email to protobuf+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.
Well - if you insist... Here's a first run, which seems to work but
I'm a very long way from a competent python programmers so feel free
to fix it up some :)
I can't see how to attach files using the google groups interface, so
I've stuck them on my webspace for now: http://grahamcox.co.uk/patches/protobuf/
There's two patches - one for serializing in a delimited form, and one
for deserializing from a delimited form.
--
Graham Cox
--
Graham Cox
I'm using it for reading/writing to sockets in my functional tests - works well enough there...In my Java-side server code, I read from the socket into a byte buffer, then deserialize the byte buffer into Protobuf objects, throwing away the data that has been deserialized. The python "MergeDelimitedFromString" function also returns the number of bytes that were processed to build up the Protobuf object, so the user could easily do the same - read the socket onto the end of a buffer, and then while the buffer is successfully deserializing into objects throw away the first x bytes as appropriate...Just a thought :)
I was saying the user *could* do that, and that it's currently what I'm doing in my server-side code. The reason being, as you said, if you naively read from a stream and the message isn't all present then you need to block until it is with the way that the Java code works at present. If you are using it for client-side code then likely this is not an issue in the slightest, but a server that needs to be able to handle many clients at once just can not block on one of them...
As to your other alternative, (a), I would suggest that this leaves too much of the underlying network protocol bare to the caller. This will make it very difficult to change the way that delimiting messages happens in the future should such a thing be required. If - for example - it is decided to go from having the length prefixed to having a special delimiting sequence after the message then it will cause all current calling code to need to be changed. It might be that this is considered a low enough level library that this is acceptable, but that would be a Google decision...
One more alternative would be how the asn1c library works for parsing ASN.1 streams into objects, which is to be resumable. The decoder reads all the data it is given, and tries to build the object from this. If it doesn't have enough data yet then it does what it can, remembers where it got to and returns back to the user who can then supply more data when it becomes available. If the entire message does parse from the data provided then return back to the user the amount of data consumed so that they can discard this (reading from the stream directly makes this slightly cleaner still). At present, the Protobuf libraries (any of them) can not support this method of decoding an object, and it is not a trivial change to make it possible to do, but it does - IMO - give a much cleaner and easier to use method of use.