Problém je v tom, že neřadíte oddělovač. Přidat:
w.Write(delimiter)
jako první řádek ve vaší metodě Write a
delimiter = r.ReadString();
jako první řádek v metodě čtení.
Pokud jde o vaše otázky k navrhovanému řešení:
To není. Fungovalo to pouze s vaším testovacím scénářem.
Metoda zápisu musí být kompatibilní s metodou čtení. Pokud napíšete dva řetězce a přečtete pouze jeden, nebude to fungovat. Myšlenka je taková, že váš objekt může být odstraněn z paměti a poté načten. To je to, co má psát a číst. Ve vašem případě – toto se skutečně dělo a vy jste nebyli schopni zachovat hodnotu objektu.