Delphi:将数据存储在某种结构中

Jor*_*ort 2 delphi structure save delphi-2010 data-persistence

对于我在Delphi 2010中工作的模拟程序.模拟不是问题,但我需要使用大量数据来解决问题.数据在Excel工作表中可用,因此无需在Delphi中编辑此数据,但从Excel工作表中收集此数据大约需要10分钟.只要您不需要在每次程序运行时收集数据,这都不是问题.所以我制作了一个程序,收集所有数据使其可见,而不是问题,然后存储它.但是我无法将其存储为"Delphi格式",而不会丢失结构,因此可以在几秒钟内加载.

我不是那么熟悉Delphi,我搜索了很长时间才得到解决方案,但却无法理解什么是最好的.我认为我构建数据的方式是错误的,但它很简单而且有效.但是,如果有更好的存储数据的方法请说明,但请记住,我需要更多的解释,而不仅仅是使用'xml文件','generict或'Ttreeview'.(已阅读但无法使用它).

数据适用于:我制作了这个产品,我制作的下一个产品就是这个,所以我需要清洁吗?对或错.

数据存储为带有Productnumber(整数)的类(TObject)和包含下一步可以生成的所有产品的List.此列表包含另一个带有Productnumber(整数)的类(TObject),我需要清理(布尔).我想将此结构保存在文件中,而不会丢失数据并将其读回相同的结构.

我希望有人可以提供帮助.先感谢您.

更新:提供更多信息的代码(修改为英文)

Clean_from = class(TObject)
public
  myfromNumber      : Integer;
  mylist            : TList;
published
  constructor Create;
End

Clean_To = class(TObject)
public
  myToNumber        : Integer;
  Clean             : Boolean;
End;

constructor Clean_from.Create;
begin
  inherited Create;
  myList := Tlist.Create;
end;

For i = 0 to 100 do
begin
  From:= Clean_from.create;
  for j := 0 to 10 do 
  begin 
    To := Clean_To.create;
    To.clean := true or false;
    From.myList.add(To);
  end;
  GlobalList.add(from);
end;
Run Code Online (Sandbox Code Playgroud)

现在我想用所有内容保存全局列表,以便我可以使用相同的结构加载它.

Arn*_*hez 19

你需要的是所谓的"序列化"机制.

1.标准方式

1.1 SaveToStream

在Delphi中,我们通常实现一个SaveToStream方法,它将每个对象的内容保存在目标TStream(a TFileStream或a TMemoryStream)中.

你必须手工编写序列化.

1.2类似DFM的流媒体

TWriter/ TReader课程.

如果在已发布的属性中定义数据,则可以使用这些标准Delphi类对它们进行序列化.

对于某些能够序列化任何TCollectionJSON内容之间的方法,请参阅此博客文章.

2. RTTI

例如,参见这个SO问题.

特别是,新增强的RTTI(自Delphi 2010以来可用)为序列化开辟了新的机会.

3.使用记录而不是类

如果每个项目都不存储大量内容(某些整数/布尔值),则使用记录而不是对象可能是有意义的.对于速度和内存消耗/碎片,它可能是值得的.

下面是一些能够序列化任何动态数组的包装器,甚至包含嵌套记录或动态数组.

4.使用数据库引擎

也许更好的方法是不要让您的数据卡在一个非演化的二进制形式中,这是您应用程序专有的.如果要添加属性,则必须手动管理.或者,如果您想从其他应用程序访问您的数据,可能会很困难.

有很多数据库解决方案 - 而不是使用外部数据库(如MS SQL,FireBird或Oracle),将数据库嵌入应用程序(更容易安装)可能是个好主意.值得一提的是包含很多包装器的SQLite,包括我们的版本(如果你想使用MS SQL或Oracle,它将允许你更改到任何其他数据库).

您还有其他解决方案 - 请参阅此问题 - 如果您需要性能,请查看我们的Big Table库.