Writing a proper serialization mechanism is ofter very difficult. The problem is most people don't realize this because it just works in their application and .Net makes it very easy to do. A lot of the problem is not understanding what factors you need to consider when writing a serializer.
Failures with serialization can be classified in two ways
For this post I use the term "box" describes a place where all the factors which can interfere with proper serialization differ. Below is a list of all of the factors I know of that can affect serialization. And by affect I mean that serializing data in one "box" and deserializing it in another "box" could have an affect on the data.
Most of the problems I've seen with respect to serialization is because people embed a "box" sensitive resource in their serialization data but don't realize it. When desigining serialization for your data you need to consider all of the factors above which affect your application.
The good news is most applications don't have to consider all of the above factors into their application. Below is a breakdown of some common category applications and the list of factors they have to consider.
 There are ways to relax these dependencies but at the end of the day some version of the assembly must be on the machine.
 Lookup COM Apartments for more information.