Jeg har lavet en del indlæg om det her på eksperten (kører lidt rundt i samme spor, men det er et interessant emne, ikke???).
Jeg ville ikke bruge faste records. Jeg ville streame data frem og tilbage fordi:
1. Der er ingen begrænsning på data. En streng kan være 32 tegn lang eller 2Gb
2. Der er ingen spild. Hvis du har en record som ligner dette:
TPerson = record
Name : string[50];
Address : string[50];
osv..
end;
så er der meget spildt hvis personen hedder "Ib Bye" og bor i "He" (i Midt-og Vestjylland). Det er der ikke når der streames med nul-terminerede strenge.
Det er let at streame data i forbindelse med objekter. Se evt.
http://www.eksperten.dk/spm/505203#rid4687035 hvor der streames en liste bestående af objekter der alle selv håndterer hvordan de skal gemmes. Jeg overvejer dog igen at bruge records (fordi sådan gør andre):
TPerson = record
Size : integer;
Name : string;
Address : string;
...
end;
Inden man gemmer data skal man sætte size og når man læser så kan man enten læse en blok af data eller starte med at læse de første 4 bytes der fortæller hvor meget recorden fylder bagefter.
Jeg holder bare stadig af min klasse med properties, der alle ved hvordan de skal læse og skrive sig selv fra og til en stream. Gider ikke have en recordstruktur og en klasse der datamæssigt er dubbleret og den sparer jeg ved at skrive data som i ovenstående link.
Grundideen er i øvrigt ens med at gemme strenge som ASCII-Z (nul-terminerede), altså uden længdeangivelse, men med en #0 i enden. Størrelsen på tal og strukturer gemmes vha sizeof(). Data starter med en længdeangivelse efterfulgt af en størrelse - jeg skipper bare recorden.
Al denne snak om at streame records er en facet af samme sag, nemlig at sende data frem og tilbage i en stream. Mit eksempel gør det til en fil - men set virker sikkert ligeså godt med en socket-stream.