O problema aqui é que você não serializa o delimitador. Adicionar:
w.Write(delimiter)
como uma primeira linha no seu método Write e
delimiter = r.ReadString();
como uma primeira linha em seu método Read.
Em relação às suas perguntas para a solução sugerida:
Isso não. Ele apenas funcionou com seu cenário de teste.
O método Write precisa ser compatível com o método Read. Se você escrever duas strings e ler apenas uma, não funcionará. A ideia aqui é que seu objeto possa ser removido da memória e então carregado. Isto é o que Write e Read devem fazer. No seu caso - isso realmente estava acontecendo e você não conseguiu manter o valor do objeto.