• variant的序列和还原


    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;
    

      

  • 相关阅读:
    一句话告诉你JQuery $(this)到底指的是什么,怎么用
    JavaScript学习历程和心得体验
    营销养号、封号、解封方法_微信公众号
    买二手房五大注意事项 这样买房才不吃亏
    Win10专业版下图片拖到PS无法打开的解决技巧
    远程服务器桌面登陆后黑屏或无法进行操作的解决办法
    monkey测试===什么是monkey测试(系列一)转
    monkey测试===Android测试工具Monkey用法简介(转载)
    monkey测试===monkeyrunner测试教程(2)
    monkey测试===monkeyrunner测试教程(1)
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/13716081.html
Copyright © 2020-2023  润新知