【发布时间】:2009-03-01 22:49:21
【问题描述】:
我目前对其他程序员如何将数据组织到文件中非常好奇。 谁能推荐任何关于创建文件结构的最佳实践的好文章或书籍?
例如,如果您出于任何目的创建了自己的软件,您是否将保存的数据保留为纯文本、序列化、编码为 xml,为什么要这样做?
有什么我遗漏的秘密吗?
【问题讨论】:
标签: file
我目前对其他程序员如何将数据组织到文件中非常好奇。 谁能推荐任何关于创建文件结构的最佳实践的好文章或书籍?
例如,如果您出于任何目的创建了自己的软件,您是否将保存的数据保留为纯文本、序列化、编码为 xml,为什么要这样做?
有什么我遗漏的秘密吗?
【问题讨论】:
标签: file
通常,至少在开始时,选择最简单的可行方法。考虑一下,例如 UNIX,其中大多数配置文件只不过是空格分隔的字段,或由另一个字符分隔的字段(例如 /etc/passwd,它使用“:”分隔符,因为 GCOS 字段可以包含空格。)
如果您的数据需要更多结构,那么问问自己“我可以轻松使用哪些工具?”例如,Python 和 Ruby 有 JSON 和 YAML。
如果您已经拥有大量基于 XML 的内容,或者您希望将 XML 转换为可在浏览器中显示的表单,那么 XML 基本上是有用的。否则,对于您从中获得的东西来说,它通常是非常重量级的(代码大小、复杂性)。
【讨论】:
无论您选择哪种格式,请记住在其中存储某种版本号(我很确定您必须进行一些更改)。
格式很大程度上取决于应用程序和数据量。对于某些应用程序,XML 是合适的,对于其他应用程序,存储在二进制文件中的固定大小的结构是好的。
我根据情况使用许多不同的格式,例如:
【讨论】:
除非您有独特的要求,否则请使用已经有成熟库的东西,这样您就可以避免编写自己的解析代码。就像人们所说的那样,这意味着 XML/JSON 等。
另一个不错的是 Google 的协议缓冲区 (http://code.google.com/p/protobuf)。在那里您编写一个通用消息定义,并且协议缓冲区编译器为您生成用于填充、序列化和反序列化数据的对象。通常格式是二进制的,但您也可以使用他们的 TextFormat 类来编写类似 JSON 的纯文本。 protobufs 的好处是可以为您生成版本控制代码。在您的文件格式的版本 2 中,您所要做的就是将字段添加到 .proto 定义文件。新版本可以读取旧文件格式,只是将新字段留空。这并不是 protobufs 的设计目的,但它们为自定义消息提供了一种简单、高效的二进制文件格式,并且为您生成了代码。
另请参阅 Facebook 的 Thrift,现在在 Apache 孵化器中。
【讨论】:
随着岁月的流逝,我发现自己越来越喜欢文字,除非它根本不可能。 CPU 的速度已经足够快,我们可以足够快地对其进行解码。
显然,当您必须经常更新大文件中的小信息时,这不是一种选择——但它很可能描述了一个数据库。
此时需要一个不寻常的情况才能让我选择这两个选项之一以外的其他选项。
【讨论】:
+1 表示 XML。有一点开销,但易于解析、读取和调试。如果您使用的是模式,可以是严格的。易于使用 XSLT 进行转换,并且非常便携(有线或仅在 pendrive 中:)
【讨论】:
这实际上取决于特定情况。您需要根据各种问题的答案来考虑您的选择:
数据本身的性质会产生影响。它是平面列表结构吗?它是一棵树吗?是循环图吗?记录是固定宽度还是可变宽度?
一旦知道了这些问题的答案,您就可以在选项中进行选择,并尽可能保持简单。通常流行的选项(XML、CSV、YAML)会适合您的目的。如果没有,那么您将不得不开发自己的格式以及自己的写作和阅读程序。
【讨论】:
有很多可能,但最实用的还是XML
【讨论】: