【问题标题】:Is it possible to save a record to a XML file without saving the fields separately?是否可以将记录保存到 XML 文件而不单独保存字段?
【发布时间】:2011-05-04 14:00:07
【问题描述】:

我有一个很大的记录,其中包含许多不同类型的字段以及动态数组。我想把它保存到一个文件中,然后再读回来。想象一下这个简单的记录:

TCustomRecord = Record
   Field1 : array of integer;
   Field2  : Integer;
   Field3 : String;
end;

通常我必须使用类似这样的东西来将此记录保存到文件中:

var
   f : File of TCustomRecord;
   cr : TCustomeRecord;
 begin
   Write(f, cr);
 end;

但由于动态数组和字符串类型,它不起作用。

所以问题是:

有没有办法将其保存(导出)到TXMLDocument 而无需遍历所有字段? (我的意思是使用addChild()逐字段添加)

【问题讨论】:

  • “记录”是什么意思?
  • @Chris:他的意思是record 变量。
  • 我仍然不知道他在问什么。 Flom - 试着更清楚地问你的问题?这太模糊了,我不知道你在问什么。也许他正在寻求一种无需“通过”(编写代码)来生成 XML 的基于 RTTI 的自动流式传输到 XML 的方法?
  • Flom,将“XML 文件”更改为“TXMLDocument”并没有真正澄清您的问题。我认为解决您的问题的方法可以让您避免编写一些代码;您能否举例说明您希望避免使用哪种代码?您能否给出一些假设的代码,您希望您可以代替使用您现在拥有的任何代码?
  • 抱歉问的含糊。我已经编辑了这个问题。希望它澄清。

标签: xml delphi record


【解决方案1】:

您的 XML 库显然需要知道字段的值是什么,否则它无法序列化它们,因此您将不得不在某个时候“遍历所有字段”。无论您是手动完成还是有某种方式自动遍历您的数据结构(如使用 RTTI)都没有区别。 有些东西必须查看所有字段。

【讨论】:

  • 如果记录的大小是固定的,有一种方法。你可以把它写成一个 Base64 编码的字节块。
  • Mime64 将二进制数据编码为 XML 文件。哇。 :-) 哇哦。
  • 不,@Runner,这不是真的。记录的大小总是固定。但记录有动态数组和字符串。存储这些值只会为您提供地址,一旦当前进程退出或字段被修改,这些地址将毫无用处。在 Flom 解释问题的真正含义之前,我的答案的先前版本解释了为什么即使记录不包含引用类型,您的建议仍然是一个坏主意。 (无论是 64 进制还是其他什么都无关紧要。)
  • @Warren,这有什么奇怪的。如何将图像序列化为 XML 节点。您将其序列化为 Base64 编码的字节流。这里有什么问题。它一直在完成。
  • 我想你知道我的意思。不要吹毛求疵。例如,如果您在记录中有一个固定大小的字段(例如 32 位整数),您可以将记录写为 32 字节的二进制数据。并以同样的方式读回它。用于将记录流式传输到流的原理相同。是的,如果你有动态数据,你就不能这样做。这就是为什么我写道,记录的大小必须是固定的。我在这里没有发现任何问题。
【解决方案2】:

我会谨慎地说“不”,尽管我不知道您所说的“遍及所有领域”是什么意思。

另一个答案链接到使用 RTTI 迭代记录中的字段的可行方法。然后,您必须确保您的记录不会使用您的 RTTI 迭代器代码不理解的任何类型,否则将无法保存。

就“不必自己调用 AddChild”而言,您可以简单地将所有内容存储在 XML 属性中,而无需任何子节点。我不知道您是否知道这一点,但将记录中的字段映射到可能产生的 XML 内容的方法不止一种。

这是一个示例记录:

TMyData = record
           Name:String;
           Age:Integer;
           Money:Double;
end;

如果您根本不想调用 AddChild,您可以只写入属性,生成一个像这样的实体:

  <MyData  Name="Warren" Age="48" Money="100.00"   />

没有人说你甚至必须使用子节点:

  <MyData> 
    <Name>Warren</Name>
    <Age>48</Age>
    <Money>100.00<Money/>
  </MyData>

所以在我看来,您似乎在回避这样一个事实,即 XML 为您提供了很多方法来实现它们,并且类似 MSXML DOM 的 API 为您提供了不止一种将任何记录映射到文件的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多