5

我是这个 Apache Avro(序列化框架)的新手。我知道什么是序列化,但为什么会有单独的框架,比如 avro、thrift、protocol buffers 和

  1. 为什么我们不能使用 java 序列化 api 而不是这些单独的框架,java 序列化 api 是否有任何缺陷。

  2. 在 avro 或任何其他序列化框架中,以下短语“在架构更改时不需要运行代码生成程序”是什么意思。

请帮助我理解所有这些!

4

3 回答 3

3

为什么我们不能使用 java 序列化 api 而不是这些单独的框架,java 序列化 api 是否有任何缺陷。

我会假设你可以使用 Java 序列化,除非你知道。

不使用它的主要原因是

  • 你知道有一个性能问题。
  • 您需要跨语言交换数据。Java 序列化仅适用于 Java。

架构更改时不需要运行代码生成程序

我猜这意味着它可以使用较旧或较新的模型读取序列化数据,而无需重新生成和编译代码。即它可以容忍模型的变化。

顺便说一句:由于我使用的数据模型通常是 a) 非常简单 b) 需要最高性能,所以我在不使用框架的情况下编写自己的序列化(或编写我自己的框架)这很好,只要您的模型非常简单并且不会经常改变。

简而言之,除非您知道自己不能,否则请先尝试 Java 序列化。

我对不同序列化方法的比较

于 2013-01-10T12:17:11.993 回答
3

1. java 序列化的问题在于它与您的代码无关。这意味着与您的类的结构紧密耦合。其他序列化框架为您提供了一些灵活性/控制,有助于绕过这种情况。尽管 java 标准机制中有一种方法可以通过 writeObject 的 readObject 方法来控制序列化,但其他 fwk 已经以更优雅的方式解决了这个问题。

其次,您不能将 java 序列化的输出与其他语言平台交换。

最后但并非最不重要的。Java 序列化不会产生更紧凑的结果,如果您执行诸如通过网络传输数据之类的操作,这可能会导致性能下降。其他协议(如 Oracle 的 POF 或协议缓冲区)更优化以产生更小的输出。

2. 关于你的第二个问题,我猜这意味着你不需要运行任何生成代码的预编译作业,以防你的序列化类的结构发生变化。我个人讨厌强制生成某种编译时代码的框架。我讨厌甚至不得不查看生成的代码的麻烦,但这只是我和我的强迫症。

于 2013-01-10T12:26:27.340 回答
1

Avro 擅长的两个原则:Hadoop 的 MapReduce 和通信协议结构。我将它用于 MapReduce,我将大量数据实例放在一个文件中,所有这些实例都符合特定的模式;每条记录都非常有效地存储,并且标记描绘了每个单独的记录。Hadoop 还使用它在 Map 和 Reduce 任务之间传递数据。比将字段名称与数据一起存储要好得多。这些文件很容易拆分为多个部分,以便在分布式计算环境中进行处理。由于模式嵌入到文件中,读者不必知道数据是什么样子。Avro 不依赖于任何语言,并且有多种语言 API 用于读取 Avro 数据。如果你想写出一个复杂的对象,那么 Java 的序列化 OR Avro 就可以了。如果您想要更高的功率和效率并使用数百万个单独的实例,那么 Avro 是一个不错的选择。我相信您可以使用 Java API 做到这一点,但为什么要那么努力。

有一些机制可以通过模式解析规则来发展模式。还有一些工具可以将您的 java 对象转换为您的模式。

最好的起点在这里:http ://avro.apache.org/docs/current/spec.html 可能需要阅读几篇文章才能了解要点。在尝试使用 Avro 软件包附带的一些工具后再次阅读。Avro 需要一段时间才能掌握窍门。JSON 仅用作数据规范语言,不用于存储数据。您可以使用 API 或 JSON 文件生成模式。很大的灵活性和足够的绳索很容易陷入困境 - 非常值得。

于 2013-01-24T15:03:46.743 回答