Le problème ici est que vous ne sérialisez pas le délimiteur. Ajouter :
w.Write(delimiter)
comme première ligne dans votre méthode Write et
delimiter = r.ReadString();
comme première ligne dans votre méthode Read.
En ce qui concerne vos questions sur la solution de contournement suggérée :
Ce ne est pas. Cela a simplement fonctionné avec votre scénario de test.
La méthode Write doit être compatible avec la méthode Read. Si vous écrivez deux chaînes et n'en lisez qu'une, cela ne fonctionnera pas. L'idée ici est que votre objet peut être supprimé de la mémoire puis chargé. C'est ce que Write et Read sont censés faire. Dans votre cas, cela se produisait effectivement et vous n'étiez pas en mesure de conserver la valeur de l'objet.