Проблемът тук е, че не сериализирате разделителя. Добавете:
w.Write(delimiter)
като първи ред във вашия метод Write и
delimiter = r.ReadString();
като първи ред във вашия метод Read.
Относно вашите въпроси към предложеното заобиколно решение:
Това не е така. Просто работи с вашия тестов сценарий.
Методът Write трябва да е съвместим с метода Read. Ако напишете два низа и прочетете само един, тогава няма да работи. Идеята тук е, че вашият обект може да бъде премахнат от паметта и след това зареден. Това е, което трябва да правят Write и Read. Във вашия случай - това наистина се случваше и не успяхте да запазите стойността на обекта.