Delphi tmemorystream описание
Автор S.T.A.L.K.E.R. задал вопрос в разделе Другие языки и технологии
Подскажите по делфи, TMemoryStream не могу считать массив... и получил лучший ответ
Ответ от Алексей Кузьминов[гуру]
Вы пишете откровенную ересь. Для Delphi имеется шаблонный механизм сериализации (запись/чтение в наследников TStream). Он подробно описан в .
Но если вам нужно сериализовать именно массив записей, то опишите 2 процедуры - запись и чтение из потока (SaveToStream(массив, поток) и LoadFromStream(var массив, поток)).
Что они будут делать:
SaveToStream - очень простая процедура, только надо предварительно записывать размер элементов
1. запись количества элементов массива WriteBuffer(Length(arr))
2. для каждого элемента:
-- 2.1 запись длины Category + запись содержимого Category WriteBuffer(Length(Category)); WriteBuffer(PChar(Category)^,Length(Category))
-- 2.2 запись длины Блоба + содержимого Блоба WriteBuffer(Blob.Size); CopyFrom(Blob, Blob.Size);
-- 2.3 см. 2.1 только для TypeBlob
С LoadFromStream всё сложнее, так как надо зачистить имеющийся массив. Набросаю (без try - блока):
procedure LFS(var arr: array of MyCategory, str: TStream);
var i, s: Integer;
begin
for i := 0 to Length(arr)-1 do arr[i].blob.Free;
SetLength(arr, 0); // зачистка завершена
str.ReadBuffer(s, SizeOf(s)); // длина массива
SetLength(arr, s);
for i := 0 to s-1 do begin // каждая запись в своём цикле
str.ReadBuffer(s, SizeOf(s));
SetLength(arr[i].Category, s); // размер строки считан и установлен
str.ReadBuffer(PChar(arr[i].Category)^, s); // собственно загрузка строки
str.ReadBuffer(s, SizeOf(s));
arr[i].Blob := TMemoryStream.Create;
arr[i].Blob.SetSize(s); // размер потока считан и установлен
str.ReadBuffer(arr[i].Blob.Memory^, s); // заполнение arr[i].Blob данными, или тупо CopyFrom
// строка TypeBlob заполняется так же как и Category
end;
end;