Problem polega na tym, że ogranicznik nie jest serializowany. Dodaj:
w.Write(delimiter)
jako pierwszy wiersz w metodzie Write i
delimiter = r.ReadString();
jako pierwszy wiersz w metodzie Read.
Jeśli chodzi o Twoje pytania do sugerowanego obejścia:
To nie. Po prostu działał z twoim scenariuszem testowym.
Metoda Write musi być zgodna z metodą Read. Jeśli napiszesz dwa ciągi i odczytasz tylko jeden, to nie zadziała. Pomysł polega na tym, że twój obiekt może zostać usunięty z pamięci, a następnie załadowany. To właśnie mają robić Write and Read. W twoim przypadku - tak się rzeczywiście działo i nie byłeś w stanie zachować wartości obiektu.