为什么我应该使用人类可读的文件格式而不是二进制格式?有没有这种情况不是这样的?
编辑:我在最初发布问题时确实有这个解释,但现在它不那么相关了:
在回答这个问题时,我想向提问者推荐一个标准的 SO 答案,说明为什么使用人类可读的文件格式是一个好主意。然后我找了一个,没找到。所以这里的问题
为什么我应该使用人类可读的文件格式而不是二进制格式?有没有这种情况不是这样的?
编辑:我在最初发布问题时确实有这个解释,但现在它不那么相关了:
在回答这个问题时,我想向提问者推荐一个标准的 SO 答案,说明为什么使用人类可读的文件格式是一个好主意。然后我找了一个,没找到。所以这里的问题
正确的答案是视情况而定。例如,如果您正在编写音频/视频数据,如果您将其转换为人类可读的格式,那么它的可读性将不高!Word 文档是人们希望它们是人类可读的、更灵活的经典示例,并且通过迁移到 XML,MS 正在朝着这个方向发展。
比二进制或文本更重要的是标准或非标准。如果您使用标准格式,那么您和下一个人很有可能不必编写解析器,这对每个人来说都是一个胜利。
以下是一些固执己见的原因,如果您必须编写自己的格式(和解析器),您可能希望选择其中一个。
归根结底,我认为两者都不能真正在这里占据优势。
你确定你真的想要一个文件吗?你考虑过数据库吗?:-)
学分
很多这个答案是将其他人在其他答案中写的东西合并在一起(你可以在那里看到它们)。尤其要感谢 Jon Skeet 的评论(无论是在这里还是离线),他提出了可以改进的方法。
这完全取决于情况。
人类可读格式的好处:
二进制格式的可能好处:
不要忘记,您始终可以实现二进制格式,但也可以生成工具来转换为人类可读的格式。这就是 Protocol Buffers 框架所做的——实际上,IME 很少需要解析协议缓冲区的文本版本,但能够将其写成文本真的很方便。
编辑:以防万一这最终成为一个公认的答案,您还应该记住starblue 提出的观点:人类可读的形式更适合区分。我怀疑设计一种适用于差异的二进制格式是可行的(并且可以生成人类可读的差异),但现有差异工具的开箱即用支持对于文本来说会更好。
文本格式的版本控制更容易,因为可以轻松查看和合并更改。
尤其是 MS-Word 在这方面让我们感到悲痛。
重要的一点:您编写了一次解析器,但多次读取了输出。这种倾向使天平有利于 HRF。
一个主要原因是,如果有人需要读取数据,比如 30 年后,可以找出人类可读的格式。二进制要困难得多。
如果您有本质上是二进制的大型数据集(例如图像),那么它们显然不能以二进制形式存储。但即便如此,元数据也可以(而且应该!)是人类可读的。
有一种东西叫做Unix 编程的艺术。
我不会说它的好坏,但它相当有名。它有一整章叫做 Textuality,其中作者断言人类可读的文件格式是 Unix 编程方式的重要组成部分。
它们打开了使用原始工具以外的工具创建/编辑的可能性。其他人可以开发新的更好的工具,集成到第三方应用程序成为可能。例如,想想二进制 iCal 文件——这种格式会成功吗?
除此之外:人类可读的文件提高了调试能力,或者对于精明的用户来说,至少可以找到错误的原因。
二进制的优点:
人类可读的优点:
我不得不处理这两种类型。如果您要发送数据并且希望将其保持为小二进制,则很好。如果您希望人们阅读它,那么人类可读性很好。
人类可读的通常也有点自我记录。使用二进制很容易出错 - 并且很难发现它们。
因为您是人类,迟早您(或您的一位客户)将能够读取数据。
如果速度是一个问题,我们只使用二进制格式。即使这样调试也很麻烦,所以我们添加了一个人类可读的等价物。
最重要的是,它们的功能可以从内容中推断出来(大多数情况下)
互操作性是标准论点,即人类可读的形式对于不同系统的开发人员来说更容易处理,因此具有一定的优势。
我个人认为这不是真的,二进制文件的性能优势应该超过这个论点,特别是如果你发布你的协议。然而,基于 XML/HTTP 的机器交互框架无处不在,这意味着它更容易被采用。
XML 被过度使用了。
只是一个简单的说明,其中人类可读的文档格式可能是更好的选择:
用于在生产中部署应用程序的文档
我们曾经有Word 格式的发行说明,但发行说明文档必须在预生产和生产平台的各种环境(Linux、Solaris)上打开。
为了提取各种数据,还必须对其进行解析。
最后,我们切换到基于 wiki 的语法,仍然可以通过 wiki 以 HTML 格式很好地显示,但在其他情况下仍然用作简单的文本文件。
作为对此的补充,人类可读性有不同的水平,所有这些都可以通过使用带有代码着色、折叠或导航的优秀编辑器或查看器来增强。
例如,
没有人说,所以我会说:人类可读性实际上并不是文件格式的属性(毕竟所有文件都是二进制文件),而是文件格式和查看器应用程序组合的属性。
所谓的人类可读格式都是基于现有文本编码之一的附加抽象层之上的。能够以人类可读的形式呈现这些编码的查看器程序(通常也用作编辑器)非常常见。
文本编码标准广泛且相当成熟,这意味着它们在可预见的未来不太可能发生太大变化。
通常在格式的文本编码层之上,我们会找到一个语法层,它在给定目标用户知识和文化背景的情况下相当直观。
因此,“人类可读”格式的好处:
合适的观众和编辑无处不在。
永恒(鉴于文化习俗不会发生太大变化)。
易于学习、阅读和修改。
依赖额外的抽象层制作文本编码文件:
太空饥渴。
处理速度较慢。
“二进制”文件不采用文本编码抽象层作为基础(或公分母),但它们可能会或可能不会使用更适合其目的的某种额外抽象,因此,它们可以更好地优化手头的具体任务的意思:
处理速度更快。
占地面积更小。
另一方面:
查看器和编辑器特定于特定的二进制格式,使互操作性更加困难。
任何给定格式的观众都不太广泛,因为他们更专业。
格式可能会随着时间的推移发生显着变化或不再使用:它们的主要好处是非常适合特定任务,并且随着任务或任务要求的发展,格式也会发生变化。
花点时间想想 Web 开发以外的应用程序。
假设: A) 它在文本格式中具有“明显”的含义是错误的。像钢铁厂或制造厂的控制系统这样的东西在人类可读方面通常没有任何优势。用于这些类型环境的软件通常具有以图形有意义的方式显示数据的例程。
B)以文本形式输出更容易。实际上需要更多代码的不必要的转换使系统变得不那么健壮。事实上,如果您不使用将所有变量都视为字符串的语言,那么人类可读的文本就是额外的转换。IE 额外代码意味着需要验证、测试的代码更多,并且有更多机会在应用程序中引入错误。
C)无论如何你都必须解析它。对于我工作过的 DSP 系统来说,很多情况下(IE NO 人类可读接口开始)。数据以统一大小的数据包从系统中流出。记录数据以供分析和后续处理只需指向缓冲区的开头并将块大小的倍数写入数据记录器系统即可。这使我能够分析“未触及”的数据,因为客户的系统会看到它,再次将其转换为不同的格式会导致可能引入错误。不仅如此,如果您只保存“转换后的数据”,您可能会丢失翻译中可能帮助您诊断问题的信息。
D) 文本是数据的自然格式。我从未见过任何硬件使用“TEXT”接口。(我大学毕业后的第一份工作是为相机线扫描相机编写设备驱动程序。)建立在它之上的系统可能确实如此,但适用于每台“PC”。
对于信息在文本格式中具有“自然”含义的网页,请务必将自己击倒。当然,对于处理源代码来说,这是一件轻而易举的事。但是,即使是冰箱和牙刷也将内置处理器的普遍计算环境,并没有那么多。简单地给这些类型的系统增加处理文本的能力会带来不必要的复杂性。您不会将“printf”链接到控制鼠标的 8 位微控制器的软件中。(是的,也必须有人编写该软件。)
世界不是一个非黑即白的地方,需要考虑的唯一计算形式是 PC 和 Web 服务器。
即使在 PC 上,如果我可以使用单个 OS 读取调用直接将数据加载到数据结构中并在不编写序列化和反序列化例程的情况下完成它,那就太棒了,检查块 CRC 工作——完成下一个问题.
嗯……因为人类可读的文件格式可以被人类阅读?对我来说似乎是一个很好的理由。
(嗯,对于配置文件,它们不可避免地会被人类读取(和编辑!)。用于某种持久存储的文件实际上不需要人类读取或编辑。)
为什么我应该使用人类可读的文件格式而不是二进制格式?有没有这种情况不是这样的?
是的,如果它们是人类可读的压缩卷(zip、jpeg、mp3 等)将不是最理想的。
我想它可能在大多数情况下都不好。我认为这些格式(例如 JSON 和 XML)的主要原因是 Web 开发,以及在 Web 上的普遍使用,您需要能够在用户端处理数据,而您不一定能读取二进制文件。使用人类可读格式的坏情况的一个很好的例子是任何非文本的东西,例如图像、视频、音频。我注意到在 Web 开发中使用非二进制格式没有意义,我感到内疚!
文件通常会成为您的人机界面的一部分,因此它们应该是人性化的(不仅仅是程序员)
我对非归档文件使用二进制流的唯一一次是当我想对不经意的观察者隐藏一些东西时。例如,如果我正在制作只有我的应用程序应该编辑的临时文件,我将使用二进制文件。
它不是试图混淆,而只是阻止用户手动编辑文件(这可能会破坏应用程序)。
这将是一个好主意的一个实例是存储/保存有关某些游戏的运行数据..即保存您的游戏并稍后继续。其他场景将描述中间文件,但无论如何这些通常都是二进制/字节编译的。
为什么我应该使用人类可读的文件格式而不是二进制格式?
取决于内容和上下文,即数据从哪里来和去哪里。如果数据通常是由人类直接编写的,那么以可以通过文本编辑器操作的格式存储它是一个好主意。例如,程序源代码通常会被存储为人类可读的,这是有充分理由的。但是,如果我们归档它,或者使用版本控制系统共享它,我们的存储策略就会改变。
如果您对某个字段有问题(例如:一个字段包含一个数字,其中规范规定该字段必须是一个字符串),则人工格式更易于解析和调试,而且人工格式更接近问题领域。
我更喜欢包含大量数据的二进制格式,并且我确信我有解析他的软件:)
在阅读菲尔丁关于 REST 的论文时,我非常喜欢“架构属性”的概念;坚持的是“可见性”。这就是我们在这里谈论的内容:能够“看到”数据。调试系统时的巨大好处。
我发现其他答案中缺少一个方面:强制语义。
从您追求人类可读的那一刻起,您就允许愚蠢的记事本用户创建要输入系统的数据。没有办法保证这些数据是有意义的。无法保证系统会以合理的方式做出响应。
因此,如果您不需要记事本检查您的数据,并且您想要强制执行有效数据(例如通过使用 API)而不是首先验证它,您最好避免使用人类可读的数据。如果可调试性是一个问题(通常是),也可以使用 API 来检查数据。
人类可读不等于更容易被机器代码解析。
以人类自然语言为例。:) 人类语言的机器解析仍然是一个有待完全解决的悬而未决的问题。
所以我同意https://stackoverflow.com/a/714111/2727173对这个问题有更深入的了解。