The most viable alternative is using the Data Contract. It is also easy to use, a totally transparent and type-agnostic technology with good performance (due to assemblies generated on the fly using System.Reflection.Emit
under the hood. Everything is explained in the documentation.