DataSet Serialization
A large part of the .NET literature out there encourages you to use DataSet object to streamline data across the tiers of a distributed application. The DataSet is serializable; easy to use; provided with an effective object model; can be saved to/restored from XML; can contain a schema; is stateful (i.e., preserves a history of changes). And so forth.
There's nothing bad with this. But when you have distributed apps spanning over one or more machines (AppDomains would suffice) .NET Remoting comes up like it or not; implicitly or explicitly.
There's nothing bad with .NET Remoting too. However, when a DataSet object is remoted (or simply serialized to any stream) the .NET runtime serialization infrastructure gets into the game.
The DataSet object implements ISerializable meaning that it provides for its own serialization format and data layout. And it does that using plain XML. (Not even blanks and tabs are removed.) As a result, when you remote a DataSet you are actually passing data using a large chunk of data made after a verbose schema--the DiffGram. No matter you use a binary channel and formatter.
This point is well addressed in the following KB article. Which, in turn, references an MSDN Magazine article of mine for further details. Both articles illustrate some workaround, the best of which I believe is using a compact-formatter that just zips everything being transferred.
The good news is that this seems to be fixed in 2.0. A new property--RemotingFormat--on DataSet and DataTable objects makes possible for you to interact with the implementation of ISerializable and choose a binary format to optimize performance in .NET Remoting scenarios.
Note that the same bad thing occurs if you store DataSet objects to ASP.NET Session with the session state configured to work out-of-process.