After some thinking, testing and researching we found a fix: The XmlReader can read from any stream without droping any data. Which means that one can easily extract the root element from the XML message without removing data from the Reader() so that the XmlSerializer can still use the reader to deserialize the object from it. Oh well...

We then added some sort of object creation facility mapping Root tags to types so the generic code goes something like:

Code:
XmlReader reader = XmlReader.Create(myNetworkStream);

reader.Read(); // Read first element, assuming its the root

Type type = rootElementToTypeMappings[reader.Name];
// create a serializer from it
XmlSerializer serializer = new XmlSerializer(type);
// reader is still in good shape for a Deserialize here
object obj = serializer.Deserialize(reader);