I have a Surface object in Android containing screen data. From what I understand, it is sort of a handle onto a frame/pixel buffer.
How can I send this object (or some representation of it) over a network to, say, a web server?
A Surface is a pool of graphics buffers with an associated queue. It has a producer-consumer interface, and the consumer can live in a different process -- buffers are sent by handle with Binder IPC. A longer explanation can be found in the graphics architecture doc.
Sending the object over the network isn't useful without also sending the associated graphics data. Since the graphics data will be about a million times larger than the object (literally, for display-sized buffers), you will usually want to focus on sending a compressed form of the images, rather than passing an object with multiple raw graphics buffers around.
The problem reduces to uploading PNG or JPEG images, or for higher volumes possibly MPEG video or VNC.