Das Problem dabei ist, dass Sie kein Trennzeichen serialisieren. Hinzufügen:
w.Write(delimiter)
als erste Zeile in Ihrer Write-Methode und
delimiter = r.ReadString();
als erste Zeile in Ihrer Read-Methode.
Bezüglich Ihrer Fragen zur vorgeschlagenen Problemumgehung:
Es tut nicht. Es hat nur mit Ihrem Testszenario funktioniert.
Die Write-Methode muss mit der Read-Methode kompatibel sein. Wenn Sie zwei Zeichenfolgen schreiben und nur eine lesen, wird es nicht funktionieren. Die Idee dabei ist, dass Ihr Objekt aus dem Speicher entfernt und dann geladen werden kann. Dies ist, was Write und Read tun sollen. In Ihrem Fall war dies tatsächlich der Fall und Sie konnten den Objektwert nicht halten.