 <blockquote> <p>Why is this the case that an empty class without any values already needs 220 bytes for saving itself?</p> </blockquote> <p>Why ask what you can find out? This code already yields 33 bytes:</p> <pre><code>FileStream fs = new FileStream("Serialized.dat", FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, "FooString"); </code></pre> <p>Because there's more being serialized than just the string itself. If you serialize an object, its class definition (and the assembly it's in) is also being serialized. Serializing an instance of this class:</p> <pre><code>[Serializable] class Foo { public String FooString { get; set; } } </code></pre> <p>Costs 166 bytes, while the <code>FooString</code> property contains the same data as the raw string serialized earlier.</p> <p>So: write your own serialization (or: load/save) logic. You are the one that reads and writes that data, so you can for example assign specific bytes in the space you have to certain properties of your class.</p>