When you write the character data, you need to make sure you write it in such a way that you know how much to read again while loading. You're currently writing just the character data, so you have no idea how much you need to read again later. You're instead assuming that Symbol
will already be the right length, which, now that I've pointed it out, is something you probably realize is an invalid assumption.
When you write the string, first write its length so it will be available to read while loading:
var
SymbolLen: Integer;
SymbolLen := Length(Data.Symbol);
Stream.Write(SymbolLen, SizeOf(SymbolLen));
Stream.Write(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Data.Symbol[1]));
Then you can read it:
Stream.Read(SymbolLen, SizeOf(SymbolLen));
SetLength(Data.Symbol, SymbolLen);
Stream.Read(PChar(Data.Symbol)^, SymbolLen * SizeOf(Data.Symbol[1]));