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

时间:2009-02-20 08:08:54

标签: file encoding formatting binary abstraction

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

编辑: 我在最初发布问题时确实有这个作为解释,但它现在不那么重要了:

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

24 个答案:

答案 0 :(得分:75)

答案 1 :(得分:26)

这完全取决于具体情况。

人类可读格式的好处:

  • 您可以使用“原生”格式阅读
  • 你可以自己写,例如单元测试 - 甚至是真实内容,取决于它的用途

二进制格式的可能好处:

  • 更容易解析(就代码而言)
  • 更快解析
  • 空间效率更高
  • 更容易控制(任何时候你需要文本,你可以确保它是UTF-8编码,长度前缀等)
  • 更容易有效地包含不透明的二进制数据(图像等 - 使用您将进入base64的文本格式)

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

编辑:万一这最终成为一个被接受的答案,你也应该记住the point made by starblue:人类可读形式很多更适合差异化。我怀疑设计一个适合于漫射的二进制格式(以及可以生成人类可读差异的地方)是可行的,但现有diff工具的开箱即用支持对于文本来说会更好。

答案 2 :(得分:17)

文本格式更容易

版本控制,因为可以轻松查看和合并更改。

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

答案 3 :(得分:7)

  • 开放格式 - 没有二进制位杂耍
  • 可读性:)
  • 跨平台的交换
  • 调试辅助工具
  • 轻松解析(并轻松转换为任何格式)

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

答案 4 :(得分:6)

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

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

答案 5 :(得分:6)

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

我不会说这是好还是坏,但它很有名。它有whole chapter called Textuality,其中作者声称人类可读的文件格式是Unix编程方式的重要组成部分。

答案 6 :(得分:4)

他们打开了使用原始工具以外的工具创建/编辑的可能性。其他人可以开发新的和更好的工具,可以集成到第三方应用程序中。例如,考虑二进制iCal文件 - 格式是否会成功?

除此之外:人类可读文件提高了调试能力,或者对于精明的用户,至少可以找到错误的原因。

答案 7 :(得分:4)

二进制的优点:

  • 快速解析<​​/ li>
  • 通常较小的数据
  • 轻松编写解析器

人类可读的优点:

  • 阅读时更容易理解 - 没有“字段X设置为4 487,这意味着反应堆现在应该关闭”
  • 如果使用像XML这样的东西,很容易编写一个可以解析任何文件的工具

我不得不处理这两种类型。如果你要发送数据而你想保持它小二进制是好的。如果你希望人们阅读它,那么人类可读是好的。

人类可读通常也有点自我记录。使用二进制文件很容易出错 - 很难发现错误。

答案 8 :(得分:3)

因为您是一个人,迟早您(或您的一个客户)将能够读取数据。

如果速度有问题,我们只使用二进制格式。即使这样调试也很麻烦所以我们添加了一个人类可读的等价物。

答案 9 :(得分:3)

  • 可编辑
  • 可读(呃!)
  • 打印
  • 记事本和启用vi

最重要的是,他们的功能可以从内容中得到解决(主要是)

答案 10 :(得分:2)

快速说明人类可读的文档格式是更好的选择:

用于在生产中部署应用程序的文档

我们曾经以word格式提供发行说明,但该发行说明文档必须在各种环境(Linux,Solaris)上以预生产和生产平台形式打开。
它还必须进行解析才能提取各种数据。

最后,我们切换到基于wiki的语法,仍然通过wiki在HTML中很好地显示,但在其他情况下仍然用作简单的文本文件。

答案 11 :(得分:2)

请花一点时间考虑除了网络开发之外的应用程序。

假设: A)它具有文本格式中“明显”的含义是错误的。 诸如钢铁厂或制造厂的控制系统之类的东西通常在人类可读性方面没有任何优势。适用于这些类型环境的软件通常具有以图形有意义的方式显示数据的例程。

B)在文本中输出它更容易。实际需要更多代码的不必要的转换会使系统变得不那么健壮。事实上如果你没有使用将所有变量视为字符串的语言,那么人类可读的文本就是额外的转换。 I.E.额外代码意味着需要验证,测试更多代码以及在应用程序中引入错误的更多机会。

C)无论如何你必须解析它。对于我曾经使用的DSP系统的许多情况(I.E.NO人类可读的接口开始。)数据以统一大小的数据包流出系统。记录数据以供分析和稍后处理只需指向缓冲区的开头并将块大小的多个写入数据记录器系统。这允许我分析数据“未触及”,因为客户的系统会将其看到哪里,再次将其转换为不同的格式会导致可能引入错误。不仅如此,如果您只保存“转换后的数据”,您可能会丢失可能有助于您诊断问题的翻译信息。

D)文本是数据的自然格式。我见过的硬件都没有使用“TEXT”界面。 (我大学毕业后的第一份工作是为相机线扫描相机编写设备驱动程序。)在它之上构建的系统可能会很糟糕,但对于每个“PC”。

对于信息具有文本格式的“自然”含义的网页,请务必将自己敲掉。当然,对于处理源代码来说,这是毫无疑问的。但普及的计算环境,即使你冰箱和TOOTHBRUSH将有一个内置的处理器,而不是。简单地加载这些类型的系统会增加处理文本的能力,这会增加复杂性。您不会将“printf”链接到用于控制鼠标的8位微控制器的软件中。 (是的,有人必须编写该软件。)

世界并不是一个黑白分明的地方,唯一需要考虑的计算形式是PC和Web服务器。

即使在PC上,如果我可以使用单个OS读取调用直接将数据直接加载到数据结构中并且无需编写序列化和反序列化例程就可以完成,这非常棒,请检查块CRC作业 - 完成下一个问题。

答案 12 :(得分:2)

没有人说,所以我会:人类可读性不是文件格式的属性(毕竟所有文件都是二进制文件),而是文件格式和查看器应用程序组合。

所谓的人类可读格式都基于现有文本编码之一的附加抽象层。并且能够以人类可读形式呈现这些编码的查看器程序(通常也作为编辑器)非常常见。

文本编码标准广泛且相当成熟,这意味着它们在可预见的未来不太可能发展很多。

通常在格式的文本编码层之上,我们找到一个语法层,根据目标用户知识和文化背景,它是相当直观的。

因此“人类可读”格式的好处:

  • 合适的观众和编辑无处不在。

  • 永恒(鉴于文化惯例不会有太大变化)。

  • 易于学习,阅读和修改。

依赖额外的抽象层使文本编码文件:

  • 空间饥饿。

  • 处理速度较慢。

“二进制”文件不会将文本编码抽象层作为基础(或共同标准),但它们可能会或可能不会使用某种更适合其目的的额外抽象,因此,它们可能会很多针对手头的特定任务更好地优化意义:

  • 加快处理速度。

  • 占地面积较小。

另一方面:

  • 观看者和编辑者特定于特定的二进制格式,并使互操作性更难。

  • 任何给定格式的观看者传播范围较小,因为它们更专业。

  • 格式可能会随着时间的推移而显着发展或不再使用:它们非常适合特定任务以及任务或任务要求发展的主要好处,格式也是如此。

答案 13 :(得分:2)

作为对此的一种辅助,人类可读性有不同的水平,并且通过使用具有代码着色,折叠或导航的优秀编辑器或查看器来增强所有这些。

例如,

  • 即使在纯文本中,JSON也非常易读
  • XML使用angle bracket tax,但在使用优质编辑器时可以使用
  • INI主要是人类可读的
  • CSV可以读取,但在加载到电子表格时效果最佳。

答案 14 :(得分:2)

互操作性是标准的论点,即不同系统的开发人员更容易处理人类可读的形式,因此具有一定的优势。

就我个人而言,我认为这不是真的,二进制文件的性能优点应该胜过这个论点,特别是如果你发布你的协议。然而,无处不在的基于XML / HTTP的机器交互框架意味着它更容易采用。

XML过度使用。

答案 15 :(得分:1)

我猜大概在大多数情况下都不好。我认为这些格式(如JSON和XML)的主要原因是因为Web开发,以及在Web上的一般用途,您需要能够在用户端处理数据,而您无法读取二进制文件。使用人类可读格式的不良案例的一个很好的例子是任何非文本的东西,如图像,视频,音频。我注意到在网络开发中使用的非二进制格式没有意义,我感到内疚!

答案 16 :(得分:1)

  

为什么我要使用人类可读的文件   格式优先于二进制格式?   有这种情况吗?   不是这样吗?

是的,压缩卷(zip,jpeg,mp3等)如果是人类可读的则不是最理想的。

答案 17 :(得分:1)

嗯...因为人类可以读取人类可读的文件格式?对我来说似乎是一个很好的理由。

(好吧,对于配置文件,它们不可避免地被人类读取(和编辑!)。用于某种类型的持久存储的文件实际上不需要由人类读取或编辑。)

答案 18 :(得分:0)

我唯一一次将二进制流用于非归档文件的时候就是我想要从不经意的观察者那里隐藏东西。例如,如果我正在制作临时文件我的应用程序应该编辑,我将使用二进制文件。

它不是试图混淆,而只是阻止用户手动编辑文件(这可能会破坏应用程序)。

这是一个好主意的一个例子是存储/保存关于某些游戏的运行数据...即保存游戏并稍后继续。其他场景会描述中间文件,但这些文件通常都是二进制/字节编译的。

答案 19 :(得分:0)

  

为什么我要使用人类可读的文件   格式优先于二进制格式?

取决于内容和上下文,即数据来自和去往的位置。如果数据通常由人直接写入,则将其存储为可通过文本编辑器操作的格式是个好主意。例如,程序源代码通常会以充分的理由存储为人类可读的。但是,如果我们将其归档或使用版本控制系统共享,我们的存储策略将会发生变化。

答案 20 :(得分:0)

通常文件会成为人机界面的一部分,因此它们应该是人性化的(不仅仅是程序员)

答案 21 :(得分:0)

如果你有一个字段问题,人工格式的解析和调试会更简单(例如:一个字段包含一个数字,其中规范说这个字段必须是一个字符串),而且人类格式对于问题

我更喜欢带有大量数据的二进制格式而且我确信我有用于解析他的软件:)

答案 22 :(得分:0)

在阅读Fielding关于REST的论文时,我真的很喜欢“Architectural Properties”的概念;一个坚持的是“可见性”。这就是我们在这里谈论的内容:能够“看到”数据。调试系统时有很大的好处。

我发现在其他答案中缺少的一个方面是:强制语义

从您可读的那一刻开始,您就可以让愚蠢的记事本用户创建要输入系统的数据。无法保证这些数据有意义。无法保证系统能够以合理的方式做出反应。

因此,在您不需要记事本检查数据的情况下,并且您希望强制执行有效数据(例如使用API​​)而不是首先验证它,您最好避免使用人类可读的数据。如果可调试性是一个问题(通常是这样),也可以使用API​​来检查数据。

答案 23 :(得分:0)

人类可读不等于更容易被机器代码解析。

以人类自然语言为例。 :)人类语言的机器解析仍然是一个待完全解决的悬而未决的问题。

所以我同意https://stackoverflow.com/a/714111/2727173对这个问题有更深入的了解。