Given your comment on Blua's answer you should look into two projects: Lidgren and Protobuf-Net. Lidgren is straight-forward and there are multiple tutorials available on how to use it - ProtoBuf-like packing can be used to provide Lidgren with the network data.
Protobuf is pretty specialized (there is nothing stopping you from using BinaryReader or BinaryWriter - but bit-packed is a tiny bit faster and quite a bit smaller). I wouldn't grab the entire library as-is: just the bit packing methods (VarInt etc.). Jon Skeet'sJon Skeet's Implementation (ProtoSharp) is really small and these methods are easy to find within it. Once you have the methods just make your own BinaryReader/BinaryWriter (I called mine PackReader/PackWriter) that read and write from the underlying stream. Avoid StreamReader and StreamWriter entirely, BinaryReader/BinaryWriter are marginally less efficient than ProtoBuf but StreamReader/StreamWriter are obtusely wasteful and slow for this purpose.
Once you have a writer implementation it's as simple as:
// Possibly defined in an interface like IPackSerializable.
public void WriteTo(PackWriter writer)
{
writer.Write(this.Position);
// Make some XNA-specific methods. Equivalent to:
// writer.Write(this.Position.X);
// writer.Write(this.Position.Y);
writer.Write(this.Speed);
writer.Write(this.Name);
}
public void ReadFrom(PackReader reader)
{
this.Position = reader.ReadVector2();
this.Speed = reader.ReadVector2();
this.Name = reader.ReadString();
}