El problema aquí es que no serializas el delimitador. Añadir:
w.Write(delimiter)
como primera línea en su método Write y
delimiter = r.ReadString();
como primera línea en su método de lectura.
Con respecto a sus preguntas sobre la solución alternativa sugerida:
No es asi. Simplemente funcionó con su escenario de prueba.
El método de escritura debe ser compatible con el método de lectura. Si escribe dos cadenas y lee solo una, entonces no funcionará. La idea aquí es que su objeto puede ser eliminado de la memoria y luego cargado. Esto es lo que se supone que deben hacer Write y Read. En su caso, esto de hecho estaba sucediendo y no pudo mantener el valor del objeto.