Thanks for your reply, makes complete sense.  I wasn't aware of $$$MaxLocalLength.

On looking into this further, it turns out I don't need to Read() at all.  Just passing the %request.Content on like this:

Set tSC tBusinessService.ProcessInput(%request.Content, .tBusinessServiceOutput)

Does the trick.  Then in the business service class, using the OpenStream() method of %XML.Reader behaves as expected when deserialising to the class objects.