I use binary serialization a lot, and have never used the Serializable or DataContract attributes. I use BinaryReader and BinaryWriter to explicitly serialize the fields I want and in the order I want.
I usually add
Serialize(BinaryWriter writer) and
Deserialize(BinaryReader reader) methods to the classes to be serialized.
For example, say the class has the following fields
The serialization i would write would be
public void Serialize(BinaryWriter writer)
public void Deserialize(BinaryReader reader)
position.X = reader.ReadSingle();
position.Y = reader.ReadSingle();
speed = reader.ReadSingle();
I usually add versioning to it as well, so that changes to the class can still load older versions of the data. That goes beyond the original question though, so I'll leave for another time if you want to know more.