天道酬勤,学无止境

What's the difference between Serialization and simply store the object on disk?

I am confused about this. Since when doing implementation of Serializable class, we need to use classes like FileOutputStream, ObjectOutputStream or something like that. Then why not we just use those classes to do things like output a object to a file and input a object from a file to maintain the status of a object directly? Why should we first implement Serializable and then do the same thing?

评论

Understand it like this...

Serializable is marker interface which denotes that the object of your class can be converted into byte stream and eventually back into java object if required. Initially you might think that every class should be serializable but that's not correct consider

Input- and OutputStreams which have some file handle to read from. That file handle is closed when the stream becomes unavailable. So serialization at this instance doesn't make sense; and de-serialization would never restore that handle.

So this should answer why marking as Serializable is required?

Now implementing methods which define how your object should be written or read; that should be defined by you and hence you need all those stream objects and readObject, writeObject methods. Hope this gives you a bit more understanding of this concept.

Serializable is just a marker interface, meaning that it is just used to signal to the code that will actually do the serialization that you (the programmer) know (or hope :-)) that this class can be serialized without issues.

Serialization itself is the conversion of an object into something that can be stored or transmitted - that is, as a stream of bytes. You can compare serialization to freezedrying, the technique used to make Nescafe - all the water is removed and only the coffee essence is stored in a jar - only an obect's state (field values) gets converted into a bytestream, not its methods.

As fvu already stated, serialization is the process of transforming an instance of a class into an array of bytes and viceversa. Not every class in Java can be transformed into an array of bytes (think about the Thread class, it just doesn't make sense to transform a thread into an array of bytes) and that's the reason you (and us) need to implement the Serializable in those objects that CAN be transformed.

Serializable is just a marker interface, it doesn't require any methods to be implemented. In most cases this is good enough: just make your serializable object implement the interface and then use the default behaviour.

That default serialization behaviour is implemented in the ObjectInputStream and ObjectOutputStream classes. FileInputStream and FileOutputStream are different classes which are meant to read and write data from files on disk.

If you want to write an object to disk you need use something like this:

MyObject obj = ... // your object instance
ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream("/path/to/file"));
stream.writeObject(obj);

To read the object back then you need this:

ObjectInputStream stream = new ObjectInputStream(new FileInputStream("/path/to/file"));
MyObject obj = (MyObject) stream.readObject();

But sometimes you'll want to serialize/deserialize an object instance into memory, not disk, then you'll use something like this:

MyObject obj = ... // your object instance
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
byte[] data = baos.toByteArray();

I'll omit the part of reading the object back from the byte array as it's quite straightforward but think in the huge combinations that you may use will all the different input/output streams provided by the JVM.


Examples above use the default serialization behaviour. However, you may face scenarios in which a given class that you want to serialize contains references to other class instances which don't implement the Serializable interface so, how do we serialize them? We need to mark those references with the transient modifier so the default serialization behaviour will ignore them and we need to override the default behaviour providing private readObject and writeObject methods that will be invoked when trying to serialize/deserialize your object instance.

Additionally, some classes may provide a replacement object (an object instance of a different serializable class) when serialization occurs. That replacement object would contain the state of the original class in way in which that original class can be restored from that replacement object. This behaviour is implemented providing a writeReplace method in the original class and a readReplace in the replacement class. Please note that both, original and replacement classes have to implement the Serializable interface but just the data in the replacement object will get serialized.

Last but not least there is the option to completely override the default serialization protocol implementing the Externalizable interface. This is not a marker interface as Serializable is and you must implement the methods to transform your object's state into an array and viceversa. You'll be still using the ObjectInputStream/ObjectOutputStream pair to serialize (externalise??) externalizable object instances but now the logic to transform your class into an array of bytes is no longer the one provided by the JVM but the one you wrote in your class when implementing the Externalizable class.

All this information is in the link that thinksteep provided as a comment.

Serialization is the process of taking an object and write it to a byte array (later read from byte array to object)

ObjectOutputStream uses serialization inside, it turns the object to byte[] using serialize and writes it to its output

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Java中的序列化需求是什么? [关闭](What is the need of serialization in Java? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 去年关闭。 改善这个问题 谁能告诉我Java中对序列化的需求是什么,并给我一个示例场景来说明这一需求? (我已经知道什么是序列化,我只想了解何时使用它)。 回答1 通常在需要通过网络发送数据或将其存储在文件中时使用序列化。 数据是指对象,而不是文本。 现在的问题是您的网络基础结构和硬盘是可以理解位和字节但不能理解JAVA对象的硬件组件。 序列化是将Java对象的值/状态转换为字节,以通过网络发送或保存它。 这类似于通过PSTN电话线传输语音的方式。 回答2 有关序列化的简短故事 经过多年的努力,地球的科学家开发了一种可以帮助他们进行日常工作的机器人。 但是,该机器人的功能要比火星科学家开发的机器人要少。 在两颗行星的科学家举行会议之后,决定火星将其机器人运送到地球。 但是出现了问题。 向地球发送100个机器人的成本为1亿美元。 大约需要60天的旅行时间。 最后,火星的科学家决定与地球的科学家分享他们的秘密。 这个秘密是关于类/机器人的结构的。 地球科学家在地球本身上开发了相同的结构。 火星的科学家序列化了每个机器人的数据,并将其发送到地球。 地球的科学家对数据进行反序列化,然后将其相应地输入到每个机器人中。
  • Java序列化的目的是什么?(What is the purpose of Serialization in Java?)
    问题 我已经读了很多关于序列化的文章,它是如此的好和很棒,但是没有一个论点令人信服。 我想知道是否有人可以告诉我通过序列化一个类真正可以实现什么? 回答1 让我们先定义序列化,然后再讨论为什么它如此有用。 序列化只是将现有对象转换为字节数组。 此字节数组表示对象的类,对象的版本以及对象的内部状态。 然后,可以在运行相同代码的JVM之间使用此字节数组来传输/读取对象。 我们为什么要这样做? 有以下几个原因: 通信:如果您有两台运行相同代码的计算机,并且它们需要通信,那么一种简单的方法是,一台计算机使用要传输的信息来构建对象,然后将该对象序列化到另一台计算机。 这不是最好的沟通方式,但可以完成工作。 持久性:如果要将特定操作的状态存储在数据库中,则可以轻松地将其序列化为字节数组,然后存储在数据库中以供以后检索。 深度复制:如果您需要对象的精确副本,并且不想麻烦编写自己的专门clone()类,只需将对象序列化为字节数组,然后将其反序列化为另一个对象可以实现此目标。 缓存:确实只是上述应用程序,但有时一个对象需要10分钟的构建时间,而反序列化仅需要10秒的时间。 因此,与其保留内存中的巨型​​对象,不如通过序列化将其缓存到文件中,然后在需要时将其读入。 跨JVM同步:序列化可在不同的JVM上运行,这些JVM可能在不同的体系结构上运行。 回答2 在运行应用程序时,其所有对象都存储在内存
  • 什么是对象编组?(What is object marshalling?)
    问题 我听说过这个概念经常使用,但是我对它的概念并不十分了解。 回答1 将内存中的对象转换为可以写入磁盘或通过电线发送的格式等。 维基百科的描述。 回答2 抱歉,维基百科对此很清楚。 在计算机科学中,编组(类似于序列化)是将对象的内存表示形式转换为适合存储或传输的数据格式的过程。 通常在必须在计算机程序的不同部分之间或从一个程序到另一个程序之间移动数据时使用。 http://en.wikipedia.org/wiki/Marshalling_(computer_science) 回答3 人们已经非常清楚地定义了编组,所以我将跳过该定义并跳到一个示例。 远程过程调用使用编组。 调用远程功能时,必须将参数编组为某种标准格式,以便可以在网络上进行传输。 回答4 编组是将对象的内存表示形式转换为可以存储或传输的数据格式的过程。 这也称为序列化(尽管在某些情况下可能有所不同)。 对象的内存表示形式可以二进制或XML的形式存储或适合存储和/或传输的任何格式,以允许您解组并将原始对象取回的方式存储。 以用法为例,如果您有一些包含客户端和服务器组件的在线游戏,并且想要将包含玩家统计信息和世界坐标的玩家对象从客户端发送到服务器(或者相反),则可以简单地编组它在客户端,通过网络发送,然后在另一端解组,它对于服务器来说就好像对象是在服务器本身上创建的一样。 这是一个红宝石示例: srcplayer =
  • 对象流
    文章目录 ObjectInputStream 和 OjbectOutputSteam序列化使用对象流序列化对象 ObjectInputStream 和 OjbectOutputSteam 用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可 以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。序列化:用ObjectOutputStream类保存基本类型数据或对象的机制反序列化:用ObjectInputStream类读取基本类型数据或对象的机制ObjectOutputStream和ObjectInputStream不能序列化static和transient修 饰的成员变量 序列化 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从 而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原来的Java对象 序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原 序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返 回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是 JavaEE 平台的基础 如果需要让某个对象支持序列化机制
  • 面试官:看你简历说精通序列化与反序列化
    很多大厂面试MQ问题,不会局限在使用,更多考察实现原理。 TCP连接传输数据的基本形式二进制流。一般编程语言或网络框架提供的API中,传输数据的基本形式是字节。二进制流和字节流本质上其实是一样的。 而对于我们编写的程序,需要通过网络传输的数据是结构化的数据形式:比如,一条命令、一段文本或者是一条消息,都可用类表示。 因此要想使用网络框架API传输结构化数据,必须实现结构化数据与字节流间的转换。 结构化数据转换成字节流,称为序列化,反之就是反序列化。 序列化除了用于在网络上传输数据,另外一个重要用途是将结构化数据保存在文件,因为在文件内保存数据的形式也是二进制,和网络传输过程中的数据本质是一样的。 很多海量数据场景,都需将对象序列化后,把它们暂时从内存转移到磁盘,等要用时,再把数据从磁盘中读取出来,反序列化成对象来使用,这样不仅可以长期保存不丢失数据,而且可以节省有限的内存空间。 怎么来实现高性能的序列化和反序列化呢。 1 序列化技术选型 只是实现序列化和反序列功能,方法有很多,最常用的直接把一个对象转换成字符串打印,就是一种序列化实现,字符串只要转成字节序列,就可在网络上传输或保存在文件。但这种实现的方式仅是能用。 有很多通用序列化实现,可直接拿来用。Java和Go语言都内置了序列化实现,也有一些流行的开源序列化实现,比如, Google 的Protobuf、Kryo
  • 一位程序员耗时一个月简直把所有Java知识面试题写出来了
    前言 作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万,而自己却囊中羞涩。于是你也想看看新机会,找个新平台,好好发展。 但是面试的时候,当那个笑眯眯的面试官问出那些你再熟悉不过的 Java 问题时,你只是感觉似曾相识,却怎么也回答不到点上。比如 HashMap 的工作原理,再或者 volatile 的使用场景。 这个时候,你可能会怀疑自己的能力,也痛恨为什么当初自己没有好好复习。 该新版文档在Github上上传一个星期已经收获30K+star的Java核心面试神技(这参数,质量多高就不用我多说了吧)非常全面,包涵Java基础、Java集合、JavaWeb、Java异常、OOP、IO与NIO、反射、注解、多线程、JVM、MySQL、MongoDB、Spring全家桶、计算机网络、分布式架构、Redis、Linux、git、前端、算法与数据结构、MyBatis、RocketMQ、Netty、Dubbo、Zookeeper、分布式缓存、数据结构等等内容非常丰富,已经帮很多人拿下互联网一线公司的offer。下面我来跟大家一起分享一下。 JavaOOP 什么是B/S架构?什么是C/S架构 Java都有哪些开发平台? 什么是JDK?什么是JRE
  • Android每日一问笔记-Parcelable 为什么效率高于 Serializable?
    基于https://www.wanandroid.com每日一问的笔记,做一些整理,方便自己进行查看和记忆。 原文链接:https://www.wanandroid.com/wenda/show/9002 为什么Parcelable的效率比Serializable高? 可以从设计目的和实现原理两个方面分析 设计目的 Serializable是Java API,是一个通用的序列化机制,通过将文件保存到本地文件、网络流等实现便数据的传递,这种数据传递不仅可以在单个程序中进行,也可以在两个不同的程序中进行;Parcelable是Android SDK API,为了在同个程序的不同组件之间和不同程序(AIDL)之间高效的传输数据,是通过IBinder通信的消息的载体。从设计目的上可以看出Parcelable就是为了Android高效传输数据而生的。 实现原理 Serializable是通过I/O读写存储在磁盘上的,使用反射机制,序列化过程较慢,且在序列化过程中创建许多临时对象,容易触发GC。Parcelable是直接在内存中读写的,自已实现封送和解封(marshalled &unmarshalled)操作,将一个完整的对象分解成Intent所支持的数据类型,不需要使用反射,所以Parcelable具有效率高,内存开销小的优点。 Parcelable为了效率损失了什么
  • 什么是序列化?(What is Serialization?)
    问题 我开始使用面向对象编程(OOP),并且想知道:在OOP中,序列化的含义是什么? 回答1 序列化是将内存中的对象转换为字节流的过程,因此您可以执行诸如将其存储在磁盘上或通过网络发送等操作。 反序列化是相反的过程:将字节流转换为内存中的对象。 回答2 简而言之,序列化是将对象转换为字节流的过程,以便可以通过网络进行传输或将其存储在持久性存储中。 反序列化与之完全相反-从网络或持久性存储中获取字节流,并将其转换回具有相同状态的Object。 要了解的是如何解释或操作这些字节流,以便我们获得完全相同的对象/相同状态。 有多种方法可以实现这一目标。 他们之中有一些是 - XML :将对象转换为XML,通过网络传输它或将其存储在文件/数据库中。 检索它并将其转换回具有相同状态的对象。 在Java中,我们使用JAXB (用于XML绑定的Java体系结构)库。(从Java 6起,它与JDK捆绑在一起)。 JSON :可以通过将对象转换为JSON (JavaScript对象表示法)来完成此操作。 再次有GSON库可用于此目的。 或者我们可以使用OOP语言本身提供的序列化。 例如,在Java中,您可以序列化对象,使其实现Serializable interface并写入对象流。 回答3 什么是序列化? 通过图片的简单说明: 用类推解释: 假设我正在和我的好友通电话谈论我的新小狗。 这是我的问题
  • Java基础高频面试题
    基本数据类型 面向对象和面向过程的区别: 面向对象就是把生活中存在的事物以类的形式在java语言中描述出来,把事物的外在特征以属性的形式来表示,把事物的行为功能以方法的形式表示出来,这样就把一个实实在在的物体在java程序中虚构出来了!面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 面向过程优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。缺点:没有面向对象易维护、易复用、易扩展面向对象优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护缺点:性能比面向过程低 java和C++区别 Java是解释型语言,所谓的解释型语言,就是源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码。对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了。C++是编译型语言,所谓编译型语言,就是源码一次编译,直接在编译的过程中链接了,形成了机器码。C++比Java执行速度快,但是Java可以利用JVM跨平台(java一次编写,到处运行)。Java是纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。而C+
  • 序列化与字节码转换(Serialization vs. Byte Code Translation)
    问题 我是编程的初学者,我只是想知道序列化过程与字节码(中间语言)之间的转换过程是否有所不同。 我在javacodegeeks.com上找到了这个: 通常在需要通过网络发送数据或将其存储在文件中时使用序列化。 数据是指对象,而不是文本。 现在的问题是您的网络基础结构和硬盘是可以理解位和字节但不能理解Java对象的硬件组件。 序列化是将Java对象的值/状态转换为字节,以通过网络发送或保存它。 ->另一方面,反序列化是将字节码转换为相应的Java对象。 <- 根据我对这一段的理解,序列化可能是java将其程序转换为字节码的过程,以便能够传输到不同的计算机环境,并且仍然可以正常运行。 我认为正确吗? 回答1 根据我对这一段的理解,序列化可能是java将其程序转换为字节码的过程,以便能够传输到不同的计算机环境,并且仍然可以正常运行。 我认为正确吗? 不,使用javac进行编译会创建在JVM上运行的字节码。 VM(例如JVM)会解释字节码,并使用一些巧妙而复杂的即时编译(取决于IS机器/平台)来提供最终产品。 请参阅字节码只是JVM解释的一堆指令。 每个字节码操作码的长度为一个字节,因此命名为字节码。 另一方面,序列化将Java对象的状态转换为字节流。 这些字节不是字节码之类的指令。 Java序列化的主要目的是将一个对象写入流中,以便可以通过网络进行传输,并且可以再次重建该对象。
  • Spark面试题
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/Lwj879525930/article/details/82559596 </div> <!--一个博主专栏付费入口--> <!--一个博主专栏付费入口结束--> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css"> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css"> <div class="htmledit_views" id="content_views"> <p>1.spark中的RDD是什么,有哪些特性?</p> 答:RDD(Resilient Distributed Dataset)叫做分布式数据集,是spark中最基本的数据抽象,它代表一个不可变,可分区,里面的元素可以并行计算的集合 Dataset:就是一个集合,用于存放数据的 Destributed:分布式
  • 序列化和反序列化笔记
    目录 序列化与反序列化 序列化 常见的序列化格式 反序列化 PHP反序列化漏洞 序列化与反序列化 序列化 将对象的状态信息转换为可以存储或传输形式的过程(字符串)。在序列化期间,对象将其当前的状态写入到临时(内存)或持久性存储区(硬盘)。以后可以通过从存储区中读取或者反序列化对象状态,重新创建状态。 简单来讲,序列化就是把一个对象变成可传输的字符串,可以以特定的格式在进程之间跨平台、安全的进行通信。字符串包括,属性名,属性值,属性类型和该对象对应的类名。 对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。讲用户存储到临时或硬盘中(数据库),可以理解为一个拍快照,通常使用非关系型Redis、MongoDB等(非关系型数据库一般用来进行缓存数据) 常见的序列化格式 二进制格式字节数组json字符串xml字符串 序列化的目的是方便数据的传输和存储。 PHP中序列化一般有以下几种,使用serialize()方法: 字符串序列化 eg: <?php header("content-type:text/html;charset=utf8"); $a='test'; echo '序列化:'; $b=serialize($a); print_r($b.'\n'); ?> 输出结果:序列化:s:4:"test"; 数组对象序列化 eg: <?php $arr =array('name'=>
  • 关于序列化的 10 几个问题,你顶得住不?
    任何序列化该类的尝试都会因NotSerializableException而失败,但这可以通过在 Java中 为 static 设置瞬态(transient)变量来轻松解决。Java 序列化相关的常见问题Java 序列化是一个重要概念, 但它很少用作持久性解决方案, 开发人员大多忽略了 Java 序列化 API。根据我的经验, Java 序列化在任何 Java核心内容面试中都是一个相当重要的话题, 在几乎所有的网面试中, 我都遇到过一两个 Java 序列化问题, 我看过一次面试, 在问几个关于序列化的问题之后候选人开始感到不自在, 因为缺乏这方面的经验。他们不知道如何在 Java 中序列化对象, 或者他们不熟悉任何 Java 示例来解释序列化, 忘记了诸如序列化在 Java 中如何工作, 什么是标记接口, 标记接口的目的是什么。瞬态变量和可变变量之间的差异, 可序列化接口具有多少种方法, 在 Java 中,Serializable 和Externalizable 有什么区别, 或者在引入注解之后, 为什么不用 @Serializable 注解或替换Serializalbe 接口。在本文中,我们将从初学者和高级别进行提问, 这对新手和具有多年 Java 开发经验的高级开发人员同样有益。关于Java序列化的10个面试问题大多数商业项目使用数据库或内存映射文件或只是普通文件,
  • 序列化和反序列化的详解
    一、基本概念 1、序列化和反序列化的定义: (1)Java序列化就是指把Java对象转换为字节序列的过程 Java反序列化就是指把字节序列恢复为Java对象的过程。 (2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。 反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。 总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息) 2、json/xml的数据传递: 在数据传输(也可称为网络传输)前,先通过序列化工具类将Java对象序列化为json/xml文件。 在数据传输(也可称为网络传输)后,再将json/xml文件反序列化为对应语言的对象 3、序列化优点: ①将对象转为字节流存储到硬盘上,当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象,并且序列化的二进制序列能够减少存储空间(永久性保存对象)。 ②序列化成字节流形式的对象可以进行网络传输(二进制形式),方便了网络传输。 ③通过序列化可以在进程间传递对象。 4、序列化算法需要做的事: ① 将对象实例相关的类元数据输出。 ② 递归地输出类的超类描述直到不再有超类。 ③ 类元数据输出完毕后
  • Java 基础知识简记
    目录Java和C++ 的区别Java 面向对象编程三大特性: 封装 继承 多态jvm、jdk 和 jre 的通俗比较重载和重写的区别在 Java 中定义一个不做事且没有参数的构造方法的作用接口和抽象类的区别是什么?成员变量与局部变量的区别有那些?创建一个对象用什么运算符?对象实体与对象引用有何不同?== 与 equals(重要)Java序列化中如果有些字段不想进行序列化,怎么办?序列化和反序列化String类和常量池八种基本类型的包装类和常量池获取用键盘输入常用的的两种方法Java多线程sleep和wait的区别 Java和C++ 的区别 二者都是面向对象的语言,都支持封装,继承和多态;Java不提供指针来直接访问内存,程序内存使用更加安全;Java的类是单继承的,但是可以实现多个接口,C++支持多重继承;Java有自动内存管理机制,不需要程序员手动释放内存。 Java 面向对象编程三大特性: 封装 继承 多态 多态 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。 在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
  • Hadoop为什么需要像Text或IntWritable这样的类而不是String或Integer?(Why does Hadoop need classes like Text or IntWritable instead of String or Integer?)
    问题 Hadoop为什么需要引入这些新类? 它们似乎只是使界面复杂化了 回答1 为了以Hadoop方式处理对象。 例如,hadoop使用Text而不是Java的String 。 hadoop中的Text类类似于java String ,但是Text实现了Comparable , Writable和WritableComparable类的接口。 这些接口对于MapReduce都是必需的。 Comparable接口用于比较化简机对键进行排序的时间,而Writable可以将结果写入本地磁盘。 它不使用java Serializable因为对于hadoop而言,java Serializable太大或太重, Writable可以以非常轻松的方式序列化hadoop对象。 回答2 因为在大数据世界中,需要将结构化对象序列化为字节流以通过网络移动或持久存储到群集上的磁盘...然后根据需要再次反序列化。 当您拥有像Facebook这样规模的海量数据来存储和移动时,您的数据需要高效且占用的存储空间和移动时间要尽可能少。 String和Integer太“胖”了。 Text和IntWritable分别在表示相同类型信息的字节数组上提供了更容易的抽象。 回答3 从Apache文档页面: Writable接口描述为 一个可序列化的对象,它基于DataInput和DataOutput实现简单,高效的序列化协议
  • 在.NET(C#)中本地存储数据的最佳方法(Best way to store data locally in .NET (C#))
    问题 我正在编写一个将用户数据存储在本地以供以后使用的应用程序。 该应用程序将经常启动和停止,我想使其在应用程序启动/结束时保存/加载数据。 如果我使用平面文件,那将是相当简单的,因为实际上并不需要保护数据(仅将数据存储在此PC上)。 因此,我相信的选择是: 平面文件 XML格式 SQL数据库 平面文件需要花费更多的精力来维护(没有像XML这样的内置类),但是我以前从未使用过XML,对于这个相对简单的任务来说,SQL似乎有些过头了。 还有其他值得探索的途径吗? 如果没有,那么哪个是最佳解决方案? 编辑:要向问题中添加更多的数据,基本上我想存储的唯一一件事就是一个看起来像这样的字典 Dictionary<string, List<Account>> 其中“帐户”是另一种自定义类型。 我是否将dict序列化为xmlroot,然后将Account类型序列化为属性? 更新2: 因此可以序列化字典。 使该问题变得复杂的是,该dict的值本身是泛型的,它是Account类型的复杂数据结构的列表。 每个帐户都非常简单,只是一堆属性。 据我了解,这里的目标是尝试并最终实现: <Username1> <Account1> <Data1>data1</Data1> <Data2>data2</Data2> </Account1> </Username1> <Username2> <Account1>
  • 有备而来——Java基础面试题全总结
    前言 主要是在 javaGuide 以及 CYC2018 的基础上做了修改以及补充阅读本文前建议先阅读《Java基础知识点总结》,形成知识体系后再看面试题会有不一样的感悟。⭐️内容较多,点赞收藏不迷路 ⭐️ 在学习一个新的事物时,要始终思考四个问题: 为什么存在(解决了什么问题) 基本原理 使用场景 和其它技术的对比 面向对象特性介绍、与C++区别 Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object,C++ 为了兼容 C 即支持面向对象也支持面向过程。Java 通过虚拟机从而实现跨平台特性,但是 C++ 依赖于特定的平台。Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。Java 支持自动垃圾回收,而 C++ 需要手动回收。Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。Java 不支持操作符重载,虽然可以对两个 String 对象执行加法运算,但是这是语言内置支持的操作,不属于操作符重载,而 C++ 可以。Java 的 goto 是保留字,但是不可用,C++ 可以使用 goto。 面向对象和面向过程的区别 面向过程 :面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix
  • 传统功夫点到为止!没想到你却想要用这一份Java知识面试题把面试官往绝路上逼,年轻人不讲武德
    前言 作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万,而自己却囊中羞涩。于是你也想看看新机会,找个新平台,好好发展。 但是面试的时候,当那个笑眯眯的面试官问出那些你再熟悉不过的 Java 问题时,你只是感觉似曾相识,却怎么也回答不到点上。比如 HashMap 的工作原理,再或者 volatile 的使用场景。 这个时候,你可能会怀疑自己的能力,也痛恨为什么当初自己没有好好复习。 该新版文档在Github上上传一个星期已经收获30K+star的Java核心面试神技(这参数,质量多高就不用我多说了吧)非常全面,包涵Java基础、Java集合、JavaWeb、Java异常、OOP、IO与NIO、反射、注解、多线程、JVM、MySQL、MongoDB、Spring全家桶、计算机网络、分布式架构、Redis、Linux、git、前端、算法与数据结构、MyBatis、RocketMQ、Netty、Dubbo、Zookeeper、分布式缓存、数据结构等等内容非常丰富,已经帮很多人拿下互联网一线公司的offer。下面我来跟大家一起分享一下。 JavaOOP 什么是B/S架构?什么是C/S架构Java都有哪些开发平台?什么是JDK?什么是JRE
  • 什么是序列化和反序列化?
    1、序列化和反序列化的定义:(1)Java序列化就是指把Java对象转换为字节序列的过程Java反序列化就是指把字节序列恢复为Java对象的过程。(2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)2、json/xml的数据传递:在数据传输(也可称为网络传输)前,先通过序列化工具类将Java对象序列化为json/xml文件。在数据传输(也可称为网络传输)后,再将json/xml文件反序列化为对应语言的对象3、序列化优点:①将对象转为字节流存储到硬盘上,当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象,并且序列化的二进制序列能够减少存储空间(永久性保存对象)。②序列化成字节流形式的对象可以进行网络传输(二进制形式),方便了网络传输。③通过序列化可以在进程间传递对象。4、序列化算法需要做的事:① 将对象实例相关的类元数据输出。② 递归地输出类的超类描述直到不再有超类。③ 类元数据输出完毕后,从最顶端的超类开始输出对象实例的实际数据值。④ 从上至下递归输出实例的数据来源