Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据序列化框架_Java_Serialization_Avro - Fatal编程技术网

Java 数据序列化框架

Java 数据序列化框架,java,serialization,avro,Java,Serialization,Avro,我不熟悉这个apacheavro(序列化框架)。我知道序列化是什么,但为什么会有单独的框架,如avro、thrift、协议缓冲区和 为什么我们不能使用java序列化api而不是这些单独的框架,java序列化api中是否存在任何缺陷 下面这个短语是什么意思 在avro或任何其他serializatio框架中,“架构更改时不需要运行代码生成程序” 请帮助我理解所有这些 为什么我们不能使用java序列化api而不是这些单独的框架,java序列化api中是否存在任何缺陷 我假设您可以使用Java序列化,

我不熟悉这个apacheavro(序列化框架)。我知道序列化是什么,但为什么会有单独的框架,如avro、thrift、协议缓冲区和

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

  • 下面这个短语是什么意思 在avro或任何其他serializatio框架中,“架构更改时不需要运行代码生成程序”

  • 请帮助我理解所有这些

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

    我假设您可以使用Java序列化,除非您知道其他情况

    不使用它的主要原因是

    • 您知道存在性能问题
    • 您需要跨语言交换数据。Java序列化仅适用于Java
    架构更改时不需要运行代码生成程序

    我猜这意味着它可以读取具有较旧或较新模型的序列化数据,而无需重新生成和编译代码。i、 e.它能够容忍模型中的变化

    顺便说一句:由于我使用的数据模型通常是a)非常简单b)需要最大的性能,我编写自己的序列化而不使用框架(或编写自己的框架)。如果您的模型非常简单并且不会经常更改,这很好

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

    我对不同的

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

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

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

    2.
    关于第二个问题,我想这意味着在序列化类的结构发生变化的情况下,不需要运行任何生成代码的预编译作业。我个人讨厌强制生成某种编译时代码的框架。我讨厌查看生成的代码的麻烦,但这只是我和我的ocd。

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

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


    最好从这里开始:可能需要读几遍才能了解要点。尝试使用Avro软件包附带的一些工具后,请再次阅读。阿夫罗需要一段时间来掌握窍门。JSON仅用作数据规范语言,不用于存储数据。您可以使用API或JSON文件生成模式。有很多灵活性和足够的绳子,很容易陷入麻烦——这是值得的。

    我支持你说的:首先尝试Java序列化。如果是拳头,那太棒了!你什么都不用做。但是,需要几分钟来考虑序列化将使用哪种方法。你需要快点吗?有一个小的输出?简单一点?您需要输出是自描述性的吗?您需要能够推送信息的增量,而不是序列化整个对象?你真的需要二进制文件吗?以此类推,…+1即使带宽不是问题,Java序列化的性能也可能非常差。完全同意,检查这个基准测试,它可能有用是的,我做的一个测试包括ByteBuffer和回收对象。