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;
    

      

  • 相关阅读:
    visual studio 目录
    CMake教程小结
    CMake教程
    blender坐标系梳理
    Blender3d obj坐标转换示意图
    行列式的向量形式
    高等代数 第一章 行列式
    C++ Union实验
    git 分支合并学习实验
    C++使用memset注意事项
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/13716081.html
Copyright © 2011-2022 走看看