为什么我应该使用人类可读的文件格式而不是二进制格式?有不是这种情况的情况吗?
编辑:我在最初发布问题时确实有这个作为解释,但现在不太相关:
在回答这个问题时,我想让提问者参考一个标准的答案,解答为什么使用人类可读的文件格式是一个好主意.然后我搜索了一个,找不到一个.所以这就是问题所在
正确的答案取决于它.例如,如果您正在编写音频/视频数据,如果您将其删除为人类可读的格式,则它将无法读取!word文档是一个典型的例子,人们希望它们是人类可读的,因此更加灵活,并且通过迁移到XML MS就是这样.
比二元或文本更重要的是标准或非标准.如果你使用标准格式,那么你很可能和下一个人不必编写解析器,这对每个人来说都是一个胜利.
如果你必须编写自己的格式(和解析器),那么下面是一些自以为是的原因,你可能想要选择一个而不是另一个.
下一个人.考虑维护开发人员从现在起30年或6个月后查看您的代码.是的,他应该有源代码.是的他应该有文件和评论.但他很可能不会.做过那个人,并且不得不拯救或转换旧的,非常有价值的数据,我会感谢你让它成为我能看到和理解的东西.
让我用自己的工具阅读并写下它.如果我是emacs用户,我可以使用它.或Vim,或记事本或......即使你已经创建了很棒的工具或库,它们也可能无法在我的平台上运行,甚至不再运行.此外,我可以使用我的工具创建新数据.
税收不是很大 - 存储是免费的.光盘空间几乎总是免费的.如果不是你就会知道.不要担心几个尖括号或逗号,通常它不会产生那么大的区别.过早优化是万恶之源.如果你真的担心只使用一个标准的压缩工具,然后你有一个小的人类可读格式 - 任何人都可以运行解压缩.
税收不是那么大 - 计算机很快.解析二进制文件可能更快.直到您需要添加额外的列或数据类型,或支持旧文件和新文件.(尽管使用Protocol Buffers可以减轻这种情况)
那里有很多好的格式.即使你不喜欢XML.试试CSV.或JSON.或.properties.甚至是XML.有很多工具可以用很多语言解析这些工具.如果神秘地所有源代码丢失,它只需要5分钟再写一次.
差异变得容易.当您签入版本控制时,更容易看到已更改的内容.并在网上查看.或者你的iPhone.二进制,你知道有些事情发生了变化,但你依靠评论来告诉你什么.
合并变得容易.您仍然会在网上收到有关如何将一个PDF附加到另一个PDF的问题.Text不会发生这种情况.
如果损坏则更容易修复.尝试并修复损坏的文本文档与损坏的zip存档.说够了.
每种语言(和平台)都可以读取或写入.当然,binary是计算机的本地语言,因此每种语言也都支持二进制文件.但是许多经典的小工具脚本语言在使用文本数据时效果更好.我想不出一种适用于二进制而不是文本(汇编程序可能)的语言,但不能反过来.这意味着您的程序可以与您从未想过的其他程序进行交互,也可以在您的程序之前30年编写.Unix有成功的原因.
你可能有很多数据 - 太字节也许.然后因子2可能真的很重要.但过早的优化仍然是所有邪恶的根源.现在如何使用人类,并在以后转换?这不会花太多时间.
存储可能是免费的,但带宽不是(Jon Skeet在评论中).如果你在网络上扔文件,那么大小确实会有所不同.甚至来自光盘的带宽也是限制因素.
真正性能密集的代码.二进制可以认真优化.数据库通常没有自己的纯文本格式是有原因的.
二进制格式可能是标准.所以使用PNG,MP3或MPEG.它使下一个人的工作变得更容易(至少在接下来的10年里).
那里有很多好的二进制格式.有些是该类数据的全球标准.或者可能是硬件设备的标准.一些是标准的序列化框架.一个很好的例子是Google Protocol Buffers.另一个例子:Bencode
更容易嵌入二进制文件.有些数据已经是二进制的,你需要嵌入它.这在二进制文件格式中自然有效,但看起来很丑,在人类可读的内容中效率非常低,并且通常会使它们无法被人阅读.
故意默默无闻.有时您不希望数据显示您的数据.加密比通过默默无闻的意外安全更好,但是如果你正在加密,你也可以将它变为二进制并完成它.
更容易解析.人们声称文本和二进制文件都更容易解析.现在很明显最容易解析的是当你的语言或库支持解析时,对于某些二进制和一些人类可读格式来说这是正确的,因此也不支持.可以清楚地选择二进制格式,因此它们易于解析,但人类可读(想想CSV或固定宽度)也是如此,所以我认为这一点没有实际意义.一些二进制格式只能被转储到内存中并按原样使用,所以这可以说是最容易解析的,特别是如果数字(不仅仅是字符串).但是我认为大多数人会认为人类可读的解析更容易调试,因为更容易看到调试器中发生了什么(略).
更容易控制.是的,更有可能有人会在他们的编辑器中破坏文本数据,或者当一种Unicode格式工作而另一种不工作时会呻吟.使用二进制数据的可能性较小.但是,人员和硬件仍然可以破坏二进制数据.您可以(并且应该)为人类可读数据指定文本编码,无论是灵活的还是固定的.
在一天结束时,我认为任何一方都不能在这里获得优势.
你确定你真的想要一个文件吗?你考虑过数据库吗?:-)
积分
很多这个答案正在将其他人写的东西合并到其他答案中(你可以在那里看到).特别要感谢Jon Skeet的评论(包括在线和离线),以便提出可以改进的方法.
这完全取决于具体情况.
人类可读格式的好处:
您可以以"原生"格式阅读它
您可以自己编写,例如单元测试 - 甚至是真实内容,具体取决于它的用途
二进制格式的可能好处:
更容易解析(在代码方面)
更快解析
在空间方面更有效率
更容易控制(任何时候你需要文本,你可以确保它是UTF-8编码,长度前缀等)
更容易有效地包含不透明的二进制数据(图像等 - 使用您将进入base64的文本格式)
不要忘记,您始终可以实现二进制格式,但也可以生成用于转换为人类可读格式的工具.这就是Protocol Buffers框架所做的事情 - 实际上非常罕见的IME需要解析协议缓冲区的文本版本,但能够将其作为文本写出来真的很方便.
编辑:万一这最终成为一个公认的答案,你也应该牢记由starblue提出的观点:人类可读的形式是很多的版本比较好.我怀疑设计一个适合于漫射的二进制格式(以及可以生成人类可读差异的地方)是可行的,但现有diff工具的开箱即用支持对文本来说会更好.
使用文本格式可以更轻松地进行版本控制,因为可以轻松查看和合并更改.
特别是MS-Word在这方面让我们感到悲痛.
开放格式 - 没有二进制位杂耍
可读性:)
跨平台的交换
调试辅助
轻松解析(并轻松转换为任何格式)
重要的一点是:您编写一次解析器,但多次读取输出.这种倾向有利于HRF.
一个主要原因是,如果有人需要阅读数据说,30年后,可以找出人类可读的格式.二进制要困难得多.
如果您的大型数据集本质上是二进制的(例如图像),那么它们显然不能以二进制形式存储.但即使这样,元数据也可以(而且应该!)是人类可读的.
有一种叫做"Unix编程艺术"的东西.
我不会说这是好还是坏,但它相当有名.它有一整章叫做Textuality,其中作者声称人类可读的文件格式是Unix编程方式的重要组成部分.