I'm currently using something similar for load and save but I store each field to the stream. I'm using this to enable the encryption of user information and some config information using my CryptoUnit I published under tutorials.

[pascal]
TFavorite = Record
User : TName;
Name : TName;
FileName : TFileName;
End;
TFavorites = Class(TObject)
Private
FavoritesList : TList;
...
Public
Procedure Load;
Procedure Save;
...
End;

procedure TFavorites.Load;
Var
I : Integer;
Fav : TFavorite;
Mem : TMemoryStream;
begin
// Load all Favorites into list
If Not FileExists(FileName) then
Exit; // Blank Favorites file - will save on close
Crypto.Password := 'Favorites for '+Application.Title;
Mem := TMemoryStream.Create;
Mem := TMemoryStream.Create;
Crypto.Decrypt(Mem,FileName);
Mem.Seek(0,soFromBeginning);
While Mem.Position < Mem.Size do
Begin
Mem.Read(Fav.User,SizeOf(TName));
Mem.Read(Fav.Name,SizeOf(TName));
Mem.Read(Fav.FileName,SizeOf(TFileName));
FavoritesList.Add(@Fav);
End;
Mem.Free;

UserName := UserName; // Initialize Current User List
end;

procedure TFavorites.Save;
Var
I : Integer;
Fav : TFavorite;
Mem : TMemoryStream;
begin
Crypto.Password := 'Favorites for '+Application.Title;
Mem := TMemoryStream.Create;
For I := 0 to FavoritesList.Count - 1 do
Begin
Fav := TFavorite(FavoritesList[I]^);
Mem.Write(Fav.User,SizeOf(TName));
Mem.Write(Fav.Name,SizeOf(TName));
Mem.Write(Fav.FileName,SizeOf(TFileName));
End;
Crypto.Encrypt(Mem,FileName);
Mem.Free;
end;

[/pascal]

Hope that helps.