Il problema qui è che non si serializza il delimitatore. Aggiungi:
w.Write(delimiter)
come prima riga nel tuo metodo Write e
delimiter = r.ReadString();
come prima riga nel tuo metodo di lettura.
Per quanto riguarda le tue domande per la soluzione alternativa suggerita:
Non è così. Ha semplicemente funzionato con il tuo scenario di test.
Il metodo di scrittura deve essere compatibile con il metodo di lettura. Se scrivi due stringhe e ne leggi solo una, non funzionerà. L'idea qui è che il tuo oggetto possa essere rimosso dalla memoria e quindi caricato. Questo è ciò che Scrivi e Leggi dovrebbero fare. Nel tuo caso, questo stava effettivamente accadendo e non sei stato in grado di mantenere il valore dell'oggetto.