zoukankan      html  css  js  c++  java
  • 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;
    

      

  • 相关阅读:
    字节面试 抖音/火山高级后台开发工程师
    面试总结 缓存Redis
    腾讯面试 WXG 微信支付核心业务应用工程师
    富途面试 基础组件Java开发
    mybatis lombok 报错: java: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor
    十进制转十六进制
    2020年第11届蓝桥杯C/C++B组 第二轮省赛
    辗转相除法
    2020年第11届蓝桥杯C/C++B组 第一轮省赛
    2020第十一届蓝桥杯大赛软件类国赛题目 C/C++ B 组
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/13716081.html
Copyright © 2011-2022 走看看