我是Apache Avro(序列化框架)的新手。我知道序列化是什么,但为什么有单独的框架,如av avro,thrift,协议缓冲区和
为什么我们不能使用java序列化api而不是这些单独的框架,java serializatio api中是否存在任何缺陷。
以下词组的含义是什么? “在avro或任何其他序列化框架中,当模式发生变化时,不需要运行代码生成程序。”
请帮助我理解所有这些!!
答案 0 :(得分:3)
为什么我们不能使用java序列化api而不是这些单独的框架,java serializatio api中是否存在任何缺陷。
我认为你可以使用Java序列化,除非你不知道。
不使用它的主要原因是
在架构更改时不需要运行代码生成程序
我猜这意味着它可以使用较旧或较新的模型读取序列化数据,而无需重新生成和编译代码。即它容忍模型的变化。
BTW:由于我使用的数据模型通常是a)非常简单b)要求最高性能,我编写自己的序列化而不使用框架(或编写我自己的框架)这很好,只要你的模型很简单,不会经常改变。简而言之,除非您知道不能,否则请先尝试Java序列化。
上做的比较答案 1 :(得分:3)
<强> 1 强> java序列化的问题在于它不能与您的代码无关。意味着与您的类的结构紧密耦合。其他序列化框架为您提供了一些灵活性/控制,可以绕过这种情况。尽管java标准机制中有一种方法可以通过writeObject readObject方法控制序列化,但是其他fwks已经以更优雅的方式解决了这个问题。
其次,您不能将java序列化的输出与其他语言平台进行交互。
最后,但并非最不重要。 Java序列化不会产生更紧凑的结果,如果您执行诸如通过网络传输数据之类的操作,则可能会导致性能下降。其他协议(如Oracle的POF或协议缓冲区)更优化,以产生更小的输出。
<强> 2 强> 关于你的第二个问题,我想这意味着你不需要在序列化类的结构发生变化的情况下运行任何生成代码的预编译作业。我个人讨厌强制某种编译时代码生成的框架。我讨厌甚至不得不查看生成的代码的麻烦,但这只是我和我的ocd。
答案 2 :(得分:1)
Avro做得很好的两件事:Hadoop的MapReduce和通信协议结构。我将它用于MapReduce,我将大量数据实例放在一个符合特定模式的文件中;每个记录都非常有效地存储,标记描绘每个单独的记录。 Hadoop还使用它在Map和Reduce任务之间传递数据。比将字段名称与数据一起存储要好得多。这些文件很容易分成多个部分,以便在分布式计算环境中进行处理。由于架构嵌入到文件中,因此读者不必知道数据的外观。 Avro与任何语言无关,并且有多种语言API可用于读取Avro数据。如果你想写出一个复杂的对象,那么Java的序列化或Avro将会起作用。如果您想要更多功能和效率并且使用数百万个体,那么Avro是一个不错的选择。我相信你可以用Java API做到这一点,但为什么要那么努力。
有一些机制可以通过模式解析规则来发展模式。还有一些工具可以将您的java对象转换为模式。
最好的起点是:http://avro.apache.org/docs/current/spec.html可能需要几次读取才能获得要点。尝试使用Avro软件包附带的一些工具后再次阅读。 Avro需要一段时间才能掌握。 JSON仅用作数据规范语言,不用于存储数据。您可以使用API或使用JSON文件生成模式。很多灵活性和足够的绳索容易陷入困境 - 非常值得。