Fair point I can see how that is an advantage, especially when performance is concerned.
"If you know that you will always get struct A followed by int B followed by Vector3 C -- it's all fine." This btw, doesn't matter as the BinaryFormatter class figures it all out for you returning a boxed object.
I guess something I also have to consider is that if I update the TNet.UnityTools class to serialize / deserialize my own objects then its no longer going to work with the standalone server? This'd be a problem for me in the future as I'll most likely want to use it on an Azure box.
Anyway, here is what I did to get TNet to work will all data types (excluding some collection types). First off I identified any types that weren't supported in Aren's list. I then created a new "tnet type" and serialized the unsupported type (using the BinaryFormatter classes) sending it as a byte array. I then detected my new "tnet type" on read and deserialized the bytes using BinaryFormatter again. This returns a simple boxed object type that could be passed through Aren's normal RFC invocation code (with a few tweaks). Job done

Couple of points for others who may want to do this, a. it has additional overheads and b. you should consider why you are sending so much data in the first place. It is convenient though not "free". As mentioned above this won't work with the native server app as it won't know what to do with the new "tnet type" (correct me if I am wrong here Aren).
Edit:
Where I have wanted to use the native TNet server I have instead created some helper classes to shift the concerns of binary serialization out of Aren's base classes to my Unity application. It just deals with sending and receiving primitive byte arrays across the TNet infrastructure instead, thus maintaining server compatibility.
Aren, I'm happy to talk more about this if it's something that interests you.