当前位置:  开发笔记 > 编程语言 > 正文

我为什么要使用人类可读的文件格式?

如何解决《我为什么要使用人类可读的文件格式?》经验,为你挑选了6个好方法。

为什么我应该使用人类可读的文件格式而不是二进制格式?有不是这种情况的情况吗?

编辑:我在最初发布问题时确实有这个作为解释,但现在不太相关:

在回答这个问题时,我想让提问者参考一个标准的答案,解答为什么使用人类可读的文件格式是一个好主意.然后我搜索了一个,找不到一个.所以这就是问题所在



1> Nick Fortesc..:

这取决于

正确的答案取决于它.例如,如果您正在编写音频/视频数据,如果您将其删除为人类可读的格式,则它将无法读取!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的评论(包括在线和离线),以便提出可以改进的方法.



2> Jon Skeet..:

这完全取决于具体情况.

人类可读格式的好处:

您可以以"原生"格式阅读它

您可以自己编写,例如单元测试 - 甚至是真实内容,具体取决于它的用途

二进制格式的可能好处:

更容易解析(在代码方面)

更快解析

在空间方面更有效率

更容易控制(任何时候你需要文本,你可以确保它是UTF-8编码,长度前缀等)

更容易有效地包含不透明的二进制数据(图像等 - 使用您将进入base64的文本格式)

不要忘记,您始终可以实现二进制格式,但也可以生成用于转换为人类可读格式的工具.这就是Protocol Buffers框架所做的事情 - 实际上非常罕见的IME需要解析协议缓冲区的文本版本,但能够将其作为文本写出来真的很方便.

编辑:万一这最终成为一个公认的答案,你也应该牢记由starblue提出的观点:人类可读的形式是很多的版本比较好.我怀疑设计一个适合于漫射的二进制格式(以及可以生成人类可读差异的地方)是可行的,但现有diff工具的开箱即用支持对文本来说会更好.



3> starblue..:

使用文本格式可以更轻松地进行版本控制,因为可以轻松查看和合并更改.

特别是MS-Word在这方面让我们感到悲痛.


@MSalters通过相同的论证你可以说大多数编程语言都不是文本,这表明你的论点是假的.

4> dirkgently..:

开放格式 - 没有二进制位杂耍

可读性:)

跨平台的交换

调试辅助

轻松解析(并轻松转换为任何格式)

重要的一点是:您编写一次解析器,但多次读取输出.这种倾向有利于HRF.


其中,我只说2和4是有效的,它们基本相同.格式可以是开放的但仍然是二进制的; 格式可以是平台中立的但不是人类可读的(例如协议缓冲区),二进制数据比文本更容易解析.

5> Joonas Pulak..:

一个主要原因是,如果有人需要阅读数据说,30年后,可以找出人类可读的格式.二进制要困难得多.

如果您的大型数据集本质上是二进制的(例如图像),那么它们显然不能以二进制形式存储.但即使这样,元数据也可以(而且应该!)是人类可读的.



6> ChrisW..:

有一种叫做"Unix编程艺术"的东西.

我不会说这是好还是坏,但它相当有名.它有一整章叫做Textuality,其中作者声称人类可读的文件格式是Unix编程方式的重要组成部分.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有