咏南数据序列(还原)类
支持序列(还原)的类型:除了支持所有基本的数据类型(integer, string, datetime, date, time,float),还支持 对象、结构体、数据集数据
1)不基于任何三方商业控件,无任何版权纠纷。
2)通过“节点”标示不同的对象和数据集数据,一次可序列(还原)N个对象和数据集的数据,主从表数量不限。
3)使用GZIP压缩数据后,再进行网络传输。
4)序列(还原)支持跨操作系统。
5)序列(还原)的接口非常简单。
6)数据集数据可使用的序列格式:bin、json、xml,默认使用bin格式。
7)支持TCP\WEBSOCK\HTTP\HTTPS各种通讯控件进行数据序列(还原)。
先上图:
procedure TForm1.Button1Click(Sender: TObject);
//序列 还原对象
var
t, t2: TTest;
d, d2: TynSerial;
ms: TMemoryStream;
begin
// 序列
t := TTest.Create;
t2 := TTest.Create;
ms := TMemoryStream.Create;
d := TynSerial.Create(ms);
t.id := 1;
t.name2 := '对象';
d.WriteObject('node1', t);
d.PrepareSerial;
// 还原
d2 := TynSerial.Create(ms);
d2.ReadObject('node1', t2);
Memo1.Lines.Add(t2.id.ToString);
Memo1.Lines.Add(t2.name2);
// 释放
t.Free;
t2.Free;
ms.Free;
d.Free;
d2.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
//序列 还原 FIREDAC数据集
var
d, d2: TynSerial;
ms: TMemoryStream;
ms2: TMemoryStream;
begin
// 序列
ms := TMemoryStream.Create;
ms2 := TMemoryStream.Create;
d := TynSerial.Create(ms);
// 序列数据集1
FDQuery1.Close;
FDQuery1.SQL.Clear;
FDQuery1.SQL.Add('select * from tgoods');
FDQuery1.Open;
d.WriteFDDataSet('node1', 'dataset1', FDQuery1);
// 序列数据集2
FDQuery1.Close;
FDQuery1.SQL.Clear;
FDQuery1.SQL.Add('select * from tunit');
FDQuery1.Open;
d.WriteFDDataSet('node1', 'dataset2', FDQuery1);
// 序列基本类型
d.WriteString('node1', 'str', '字符串');
d.WriteInteger('node2', 'int', 258);
// 准备
d.PrepareSerial;
// 压缩
ms.Position := 0;
ZCompressStream(ms, ms2);
// 解压
ms2.Position := 0;
ms.Clear;
ZDecompressStream(ms2, ms);
//还原
d2 := TynSerial.Create(ms);
// 还原数据集1
d2.ReadFDDataSet('node1', 'dataset1', FDMemTable1);
DataSource1.DataSet := FDMemTable1;
// 还原数据集2
d2.ReadFDDataSet('node1', 'dataset2', FDMemTable2);
DataSource2.DataSet := FDMemTable2;
// 还原基本类型
Memo1.Lines.Add(d2.ReadString('node1', 'str', ''));
Memo1.Lines.Add(d2.ReadInteger('node2', 'int', 0).ToString);
// 释放
ms.Free;
ms2.Free;
d.Free;
d2.Free;
end;
procedure TForm1.Button3Click(Sender: TObject);
//序列 还原DataSetProvider1.Data
var
d, d2: TynSerial;
ms: TMemoryStream;
ms2: TMemoryStream;
begin
// 序列
ms := TMemoryStream.Create;
ms2 := TMemoryStream.Create;
d := TynSerial.Create(ms);
FDQuery1.Close;
FDQuery1.SQL.Clear;
FDQuery1.SQL.Add('select * from tgoods');
d.WriteOleVariant('node1', 'dataset', DataSetProvider1.Data);
d.PrepareSerial;
ms.Position := 0;
ZCompressStream(ms, ms2); // 压缩
// 还原
ms2.Position := 0;
ms.Clear;
ZDecompressStream(ms2, ms); // 解压
d2 := TynSerial.Create(ms);
d2.ReadOleVariant('node1', 'dataset', ClientDataSet1);
DataSource1.DataSet := ClientDataSet1;
// 释放
ms.Free;
ms2.Free;
d.Free;
d2.Free;
end;
procedure TForm1.Button4Click(Sender: TObject);
//序列还原结构体
var
r, r2: TRec;
d, d2: TynSerial;
ms: TMemoryStream;
begin
// 序列
r.id := 1;
r.name2 := '结构体';
ms := TMemoryStream.Create;
d := TynSerial.Create(ms);
d.WriteRecord('node1', 'record', r, SizeOf(r));
d.PrepareSerial;
// 还原
d2 := TynSerial.Create(ms);
d2.ReadRecord('node1', 'record', r2, SizeOf(r2));
Memo1.Lines.Add(r2.id.ToString);
Memo1.Lines.Add(string(r2.name2));
// 释放
ms.Free;
d.Free;
d2.Free;
end;
procedure TForm1.Button5Click(Sender: TObject);
//序列还原文件
var
d, d2: TynSerial;
ms, ms2: TMemoryStream;
begin
//序列
ms := TMemoryStream.Create;
d := TynSerial.Create(ms);
d.WriteFile('node1', 'file', ExtractFilePath(ParamStr(0)) + '1.exe');
d.PrepareSerial;
//压缩
ms2 := TMemoryStream.Create;
ms.Position := 0;
ZCompressStream(ms, ms2);
//解压
ms.Clear;
ms2.Position := 0;
ZDecompressStream(ms2, ms);
//还原
d2 := TynSerial.Create(ms);
d2.ReadFile('node1', 'file', 'd:\1.exe');
//释放
ms.Free;
ms2.Free;
d.Free;
d2.Free;
end;