Algorithm Math Delphi

Title: How to convert variant to Stream and then back
// Variant -- Stream
var
ov: OleVariant;
ms: TStream;
p: Pointer;
begin
ov := dmMain.ComConnection.AppServer.TimeZone;
ms := TMemoryStream.Create;
ms.Position := 0;
p := VarArrayLock(ov);
ms.Write(p ^, VarArrayHighBound(ov, 1));
//is it the best way to get the Variant's length?
VarArrayUnlock(ov);
ms.Position := 0;
...ms.Free;
end;
// Stream -- Variant
function TTCanteenSvr.Get_TimeZone: OleVariant;
var
AStream: TStream;
MyBuffer: Pointer;
begin
try
AStream := TFileStream.Create(, fmOpenRead);
Result := VarArrayCreate([0, AStream.Size - 1], VarByte);
MyBuffer := VarArrayLock(Result);
AStream.ReadBuffer(MyBuffer^, AStream.Size);
VarArrayUnlock(Result);
finally
AStream.Free;
end;
//notice: I have asked this question on BDN, and David Lewis told me
// to use the function VarArrayLock.