Todd said..
The answer depends on whether the tiers are distributed onto different machines. If so, you should serialize your objects via XML (DataSets will do this automatically, but DataSets are a poor choice because they are so large and inefficient).
If you are not distributing your tiers, then using custom classes or DataSets can work. Custom classes are the preferred approach if you are doing anything more than a simple CRUD app.