Problemet här är att du inte serialiserar avgränsare. Lägg till:
w.Write(delimiter)
som en första rad i din skrivmetod och
delimiter = r.ReadString();
som en första rad i din läsmetod.
Angående dina frågor till föreslagen lösning:
Det gör det inte. Det fungerade bara med ditt testscenario.
Skrivmetoden måste vara kompatibel med läsmetoden. Om du skriver två strängar och bara läser en så kommer det inte att fungera. Tanken här är att ditt objekt kan tas bort från minnet och sedan laddas. Det här är vad Skriv och Läs ska göra. I ditt fall - detta hände verkligen och du kunde inte behålla objektvärdet.