variant的序列和还原
variant是delphi的万能数据类型,所以先要判断它存储的是哪种类型的数据。
不同类型的数据,要不同地处理。
procedure TMsgPack.SetAsVariant(const Value: Variant);
var
I: Integer;
AType: TVarType;
procedure VarAsBytes;
var
L: Integer;
p: PByte;
begin
FDataType := mptBinary;
L := VarArrayHighBound(Value, 1) + 1;
SetLength(FValue, L);
p := VarArrayLock(Value);
Move(p^, FValue[0], L);
VarArrayUnlock(Value);
end;
begin
if VarIsArray(Value) then
begin
AType := VarType(Value);
if (AType and varTypeMask) = varByte then
VarAsBytes
else
begin
checkObjectDataType(mptArray);
ClearAndFreeAllChildren;
for I := VarArrayLowBound(Value, VarArrayDimCount(Value))
to VarArrayHighBound(Value, VarArrayDimCount(Value)) do
Add.AsVariant := Value[I];
end;
end
else
begin
case VarType(Value) of
varSmallInt, varInteger, varByte, varShortInt, varWord,
varLongWord, varInt64:
AsInteger := Value;
varSingle, varDouble, varCurrency:
AsFloat := Value;
varDate:
AsDateTime := Value;
varOleStr, varString{$IFDEF UNICODE}, varUString{$ENDIF}:
AsString := Value;
varBoolean:
AsBoolean := Value;
varNull,varEmpty,varUnknown:
begin
FDataType:=mptNull;
SetLength(FValue, 0);
end;
{$IF RtlVersion>=26}
varUInt64:
AsInteger := Value;
{$IFEND}
else
// null
;//raise Exception.Create(SVariantConvertNotSupport);
end;
end;
end;
function TMsgPack.GetAsVariant: Variant;
var
I: Integer;
procedure BytesAsVariant;
var
L: Integer;
p:PByte;
begin
L := Length(FValue);
Result := VarArrayCreate([0, L - 1], varByte);
p:=VarArrayLock(Result);
Move(FValue[0],p^,L);
VarArrayUnlock(Result);
end;
begin
case FDataType of
mptNull:
Result := null;
mptString:
Result := AsString;
mptInteger:
Result := AsInteger;
mptFloat:
Result := AsFloat;
mptSingle:
Result := AsSingle;
mptDateTime:
Result := AsDateTime;
mptBoolean:
Result := AsBoolean;
mptArray, mptMap:
begin
Result := VarArrayCreate([0, Count - 1], varVariant);
for I := 0 to Count - 1 do
Result[I] := TMsgPack(FChildren[I]).AsVariant;
end;
mptBinary:
BytesAsVariant;
else
raise Exception.Create(SVariantConvertNotSupport);
end;
end;
原文:https://www.cnblogs.com/hnxxcxg/p/13716081.html