QMsgPack支持AsVariant方法,而TClientDataSet提供了一个Data属性的Variant类型变量直接传递数据集内容,由此,我们可以方便的建立两者之间的关系。
【提示】
在Delphi的早期版本中,Data这个Variant类型的值内部使用的是AnsiString来存贮的字节流,但我并不确定Delphi从什么时候开始,将其改为了Byte数组类型,你可以通过VarType函数来检测它的类型,但QMsgPack做为一个更底层的实现,不适合做这种检测。
1、将数据集的Data保存到MessagePack协议数据流或文件:
var AMsgPack:TQMsgPack; begin AMsgPack:=TQMsgPack.Create; ... AMsgPack.AsVariant:=ClientDataSet1.Data; //保存到流AStream中 AMsgPack.SaveToStream(AStream); //或保存到文件AFileName中 AMsgPack.SaveToFile(AFileName); ... FreeAndNil(AMsgPack); end;
2、从MessagePack协议数据流或文件中加载到数据集
var AMsgPack:TQMsgPack; begin AMsgPack:=TQMsgPack.Create; //从流AStream中加载 AMsgPack.LoadFromStream(AStream); //或从文件AFileName中加载 AMsgPack.LoadFromFile(AFileName); ... ClientDataSet1.Close; ClientDataSet1.Data:=AMsgPack.AsVariant; ... FreeAndNil(AMsgPack); end;
对于早期的版本,我们需要做一个转换:
1、从AnsiString转换为TBytes,然后再赋给AMsgPack。
var S:AnsiString; ABytes:TBytes; ... begin ... //首先将Data赋给一个字符串对象 S:=ClientDataSet1.Data; //复制到字节流中 SetLength(ABytes,Length(S)); Move(PAnsiChar(S)^,ABytes[0],Length(S)); //用AsBytes替换AsVariant AMsgPack.AsBytes:=ABytes; ... end;
2、加载时反过来将字节流反转成AnsiString
var S:AnsiString; ABytes:TBytes; ... begin ... //首先将Data赋给一个字符串对象 ABytes:=AMsgPack.AsBytes; SetLength(S,Length(ABytes)); Move(ABytes[0],PAnsiChar(S)^,Length(ABytes)); //然后将字符串赋给Data就好了。 ClientDataSet1.Data:=S;... end;