delphi 编程中,如何对TStringlist对象进行序列化和反序列化呢? 哪位大虾能帮帮我啊,万分感激啊!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 编程中,如何对TStringlist对象进行序列化和反序列化呢? 哪位大虾能帮帮我啊,万分感激啊!!!相关的知识,希望对你有一定的参考价值。

小弟想快点解决问题,大虾们最好能把步骤说详细点了。
我需要的是对TStringList的对象的内存进行序列化和反序列化,而不是TStringList的用法,,请高手们帮帮忙啦。。。

TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。
常规的用法大家都知道,现在来讨论它的一些高级的用法。
先把要讨论的几个属性列出来:
1、CommaText
2、Delimiter & DelimitedText
3、Names & Values & ValueFromIndex
先看第一个:CommaText。怎么用呢?用代码说话:
const
constr :String = 'aaa,bbb,ccc,ddd';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.CommaText := constr;
for i := 0 to Strs.Count-1 do
ShowMessage(Strs[i]);
end;
执行了这段代码后,可以看到ShowMessage显示出来的分别是:aaa bbb ccc ddd。
也就是说,strs.CommaText := constr这一句的作用,就是把一个字符串以','为分割符,分段添加到TStrings中。
那么如果不是以','来分割,又该怎么做呢?现在看第二个例子。使用Delimiter和DelimitedText。
const
constr :String = 'aaa\bbb\ccc\ddd';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.Delimiter := '\';
strs.DelimitedText := constr;
for i := 0 to Strs.Count-1 do
ShowMessage(Strs[i]);
end;
可以看到, 显示的效果和第一个例子是一模一样的。解释一下:
Delimiter为分隔符,默认为:','。DelimitedText就是按Delimiter为分隔符的一个串,得到赋值后回把这个字符串按Delimiter的字符添加到TStrings中。
说到这里,有想起一个属性,QuoteChar。其默认值为:'"'(不包括单引号)
有何用呢?看例子:
const
constr :String = '"aaa"\"bbb"\"ccc"\"ddd"';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.Delimiter := '\';
strs.DelimitedText := constr;
for i := 0 to Strs.Count-1 do
ShowMessage(Strs[i]);
end;
显示出来的仍然是aaa bbb ccc ddd。为什么不是:"aaa" "bbb" "ccc" "ddd"呢?
再来看一个例子:
const
constr :String = '|aaa|\|bbb|\|ccc|\|ddd|';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.Delimiter := '\';
strs.QuoteChar := '|';
strs.DelimitedText := constr;
for i := 0 to Strs.Count-1 do
ShowMessage(Strs[i]);
end;
显示出来的又是aaa bbb ccc ddd。对比一下,应该不难明白吧?这个就不多说了,用得也不多。
但是还要多说一句,当Delimiter为:','而QuoteChar为:'"'时,DelimitedText和CommaText是同等的。
最后要说的三个是:Names & Values & ValueFromIndex。
看看下面的代码:
const
constr :String = '0=aaa,1=bbb,2=ccc,3=ddd';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.CommaText := constr;
for i := 0 to strs.Count-1 do
begin
ShowMessage(strs.Names[i]);
ShowMessage(strs.Values[strs.Names[i]]);
ShowMessage(strs.ValueFromIndex[i]);
end;
end;
通过这个例子不难看出:
这个时候strs中的内容是:
0=aaa
1=bbb
2=ccc
3=ddd
而Names中则是:
0
1
2
3
在Values中则是:
aaa
bbb
ccc
ddd
参考技术A 只有序列化,要没有与之匹配的反序列化能力,基本上就能说明序列化没有意义。
沿此思路,我想说反序列化的想法太理想化,StringList的基本内容是string,string在内存中是结构(含指针)和指针指向具体内容的混合体,而指针是动态申请内存构造出来的,每次执行程序申请到的内存地址可能不一样,所以,把某次的内存镜像落地,企图再次装载进来和上次一致的做法是危险的,很容易造成非法地址访问异常,也就是说,反序列化不靠谱。本回答被提问者采纳
参考技术B 序列化
TStringList.SaveToFile
或 TStringList.SaveToStream

反序列化
TStringList.LoadFromFile
或 TStringList.LoadFromStream

很多Delphi类都有这些函数追问

这几个方法我都知道的。。。。。。。。。。
你说的不是我想要的,我的意思是:有没有办法把TStringList的对象内存整个的序列化到硬盘中,然后下次再读取该二进制文件直接还原成对象??

追答

有这个必要吗?

参考技术C “进行序列化和反序列化”是什么意思?

数组属性、TList、TStringList 或 TCollection 等 (Delphi Win32)

【中文标题】数组属性、TList、TStringList 或 TCollection 等 (Delphi Win32)【英文标题】:Array Property, TList, TStringList, or TCollection, etc (Delphi Win32) 【发布时间】:2010-10-07 14:35:00 【问题描述】:

我正在开发各种组件,并且经常遇到需要具有“一对多”关系的属性,即组件到属性成员。组件通常是可视组件,但并非总是如此,有时需要在 IDE 中注册(即使用 Property Inspector),但并非总是如此。我发现自己不确定在设置这些属性时应该采取哪条路线——使用数组属性、TList、TStringList、TCollection 或其他东西(可能是从其中一个继承的新类)。

什么时候/在哪里使用的“最佳实践”/指南是什么?

【问题讨论】:

【参考方案1】:

如果它们是属性,则可以从 TCollection 继承,然后 IDE 和 Object Inspector 将通过 TCollection 属性编辑器自动为它们提供支持。

【讨论】:

Nick,为了支持 OI,不是 TOwnedCollection 吗? 不,TCollection 很好 --【参考方案2】:

TObjectList 和 TInterfaceList / IInterfaceList 是我的最爱。还有用于线程安全列表的 TThreadList。所有这些都在 Delphi 6(甚至更早版本)中可用。

【讨论】:

以上是关于delphi 编程中,如何对TStringlist对象进行序列化和反序列化呢? 哪位大虾能帮帮我啊,万分感激啊!!!的主要内容,如果未能解决你的问题,请参考以下文章

Delphi TStringList的用法

Delphi - TStringList保存的文件如何避免保持为UTF-8 BOM格式?

Delphi TStringList的用法

在Delphi中对Tstringlist中的数字数据进行数字排序

delphi TStringList 用法详解

delphi TStringList 用法详解