【问题标题】:Writing complex records to file将复杂记录写入文件
【发布时间】:2010-12-26 09:40:16
【问题描述】:

嗨 我在我的项目中定义了一些记录,这些记录可能由其他记录以及普通数据类型和其他记录的动态数组组成, 这是一个记录类型的例子

  Type1=record
    x:integer;
  end;
  Type2=record
    Y:array of X;
    str:string;
  end;

当我尝试使用这样的块写入函数将这些记录类型的变量之一保存到文件时:

var
  Temp1:Type2;
  begin
    setlength(temp1.y,100);
    blockwrite(MyFile,Temp1,sizeOf(Temp1);

它只写了纯记录的大小,但是 temp1 有一个调整大小的动态数组, 有人可以告诉我如何将复杂的记录写入文件,我的意思是类似于 VB6 中使用的东西。 谢谢

【问题讨论】:

标签: arrays delphi dynamic sizeof record


【解决方案1】:

您可以使用https://github.com/KrystianBigaj/kblib(适用于任何动态记录,也适用于包含其他记录的记录等)。在 Delphi 2006/2009/XE 上测试(它不使用 D2010 中引入的扩展 RTTI)。无需手动编写保存/加载代码(只需一行即可保存/加载任何动态类型 - 字符串、记录、动态数组)。

在你的例子中它会是某事。像这样:

TKBDynamic.WriteTo(lStream, lType2, TypeInfo(Type2));

要加载它:

TKBDynamic.ReadFrom(lStream, lType2, TypeInfo(Type2));

如果有人对如何处理“记录版本”感兴趣,只需发布​​新问题,然后我会写一些示例。

类似问题:

【讨论】:

  • +1 这很好用。通过使用 NativeUInt 而不是 cardinal 进行指针运算,可以使代码与即将推出的 64 位编译器兼容。
  • Delphi64 发布时,我会升级代码。现在我根本无法在 Delphi x64 中对其进行测试,因此在没有测试的情况下制作面向未来的代码可能会带来错误(或在 x64 中无法正常工作)。我知道这是简单的指针数学,但仍然...... :)
  • 也可能使用 D64 结构,例如字符串头会改变(我认为字符串的内容应该对齐到 8 个字节,现在在 >=D2009 中,它是 12 个字节,所以在 D64 中应该是16 个字节)——只是我的猜测。这样的更改不会破坏保存的 TKBDynamic 的二进制结构,但需要在 kblib 中升级代码。所以我会等待更改直到发布。
  • @kibab 这是一个漂亮的库,可惜我的版本控制要求意味着我永远无法使用它或其中包含的 RTTI 技术。
  • @kibab:您可以 100% 确定 NativeUInt 将用于 64 位编译器的指针运算。也有人说字符串头不会随着即将发布的版本而改变(没有理由 - 在所有情况下,使用 SetString 总是安全的)。默认对齐可以在未来的版本中更改,但它将由当前代码处理,因为它是在 RTTI 中编码的(在偏移值中)。如果您使用记录进行序列化,我建议使用打包记录,因为它将使用更少的存储空间,并且无论默认对齐方式是什么,它都可以跨编译器
【解决方案2】:

这行不通。您将需要手动编写(流式传输)代码来编写每个字段。

查看类中已发布的字段/属性,因为与变体数组一起,这曾经是使用通用代码流式传输数据的唯一方法。

不过,自 D2010 以来,RTTI 有所扩展,但我还不知道具体细节。

【讨论】:

  • 确实如此。我的代码库有很大一部分专门用于执行此操作。例如,字符串持久性代码写入长度后跟内容。根据您对代码开发的看法,可能值得为文件格式构建兼容性功能。我希望有 3rd 方组件来做这些事情,但我个人一直都是自己做的。
  • 文件格式兼容性是我主要手动流式传输代码的原因。我不得不承认,虽然我的不是很大或很复杂
猜你喜欢
  • 1970-01-01
  • 2012-07-28
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
相关资源
最近更新 更多