1、什么是序列化和系列化DE-
2、JDK的序列化
1) 在某些场合,希望类的不同版本号对序列化兼容。因此须要确保类的不同版本号具有同样的serialVersionUID;
2) 在某些场合,不希望类的不同版本号对序列化兼容。因此须要确保类的不同版本号具有不同的serialVersionUID。
java的序列化算法要考虑到以下这些东西:
◆将对象实例相关的类元数据输出。
◆递归地输出类的超类描写叙述直到不再有超类。
◆类元数据完了以后。開始从最顶层的超类開始输出对象实例的实际数据值。
◆从上至下递归输出实例的数据
所以java的序列化确实非常强大,序列化后得到的信息也非常具体。所以反序列化就so easy.
import java.io.Serializable; public class Block implements Serializable{ /**
*
*/
private static final long serialVersionUID = 1L; private int id;
private String name; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Block(int id, String name) {
this.id = id;
this.name = name;
} }
以下我们来測试一下序列化的结果:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class TestSerializable {
public static void main(String[] args) throws IOException,
ClassNotFoundException {
//将序列化化的数据写到文件out里面(持久化)
FileOutputStream fos = new FileOutputStream("./out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
for (int i = 0; i < 100; i++) {
Block b = new Block(i, "B"+i);
oos.writeObject(b);
}
oos.flush();
oos.close(); //读出一个序列化的对象的字节序列(^..^)就是反序列化
FileInputStream fis = new FileInputStream("./out");
ObjectInputStream ois = new ObjectInputStream(fis);
Block b2 = (Block) ois.readObject();
ois.close();
System.out.println(b2.getName());
}
}
測试的结果:(取出第一个对象的name)
B0
生成一百个对象的持久化数据的大小是:1.60 KB (1,643 字节)一个对象平均16个字节,该类仅仅有两个字段一个是int,一个字符串可是字符串的长度为2,所以我们能够感受到这冗余还是挺大的。
3、hadoop的序列化
package hadoop; import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.junit.Test; public class Testhadoop_serializable_writable {
@Test
public void serializable() throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(out);
FileOutputStream fos = new FileOutputStream("./hadoop_out");
for (int i = 0; i < 10; i++) {
Text t1 = new Text(String.valueOf(i));
Text t2 = new Text("mw");
MyWritable mw = new MyWritable(t1,t2);
mw.write(dataOut);
}
dataOut.close();
fos.write(out.toByteArray());
fos.flush();
fos.close(); FileInputStream fis = new FileInputStream("./hadoop_out");
DataInputStream dis = new DataInputStream(fis);
for (int i = 0; i < 10; i++) {
MyWritable mw = new MyWritable(new Text(), new Text());
mw.readFields(dis);
System.out.println(mw.getId() + " " + mw.getName());
} }
} class MyWritable implements Writable {
private Text id;
private Text name; public MyWritable(Text id, Text name) {
super();
this.id = id;
this.name = name;
} public synchronized Text getId() {
return id;
} public synchronized void setId(Text id) {
this.id = id;
} public synchronized Text getName() {
return name;
} public synchronized void setName(Text name) {
this.name = name;
} @Override
public void write(DataOutput out) throws IOException {
id.write(out);
name.write(out);
} @Override
public void readFields(DataInput in) throws IOException {
id.readFields(in);
name.readFields(in);
} }
我们能够看到我们实现的自己序列化类MyWritable。他有两个字段都是Text,Text是hadoop自带的序列化类,能够看做字符串(类似吧)吧?!
![java序列化是什么和反序列化和hadoop序列化 java序列化是什么和反序列化和hadoop序列化](https://image.shishitao.com:8440/aHR0cDovL2Jic21heC5pa2FmYW4uY29tL3N0YXRpYy9MM0J5YjNoNUwyaDBkSEF2YVcxbkxtSnNiMmN1WTNOa2JpNXVaWFF2TWpBeE5EQTRNVGd5TURFNU1UZzRPVEEvZDJGMFpYSnRZWEpyTHpJdmRHVjRkQzloU0ZJd1kwUnZka3d5U25OaU1tTjFXVE5PYTJKcE5YVmFXRkYyV2tkR2JWcFhOVzVZTWtwellqSmpQUzltYjI1MEx6VmhOa3cxVERKVUwyWnZiblJ6YVhwbEx6UXdNQzltYVd4c0wwa3dTa0pSYTBaRFRVRTlQUzlrYVhOemIyeDJaUzgzTUM5bmNtRjJhWFI1TDFOdmRYUm9SV0Z6ZEE9PS5qcGc%3D.jpg?w=700&webp=1)
![java序列化是什么和反序列化和hadoop序列化 java序列化是什么和反序列化和hadoop序列化](https://image.shishitao.com:8440/aHR0cDovL2Jic21heC5pa2FmYW4uY29tL3N0YXRpYy9MM0J5YjNoNUwyaDBkSEF2YVcxbkxtSnNiMmN1WTNOa2JpNXVaWFF2TWpBeE5EQTRNVGd5TURJeU1UZzVNRFEvZDJGMFpYSnRZWEpyTHpJdmRHVjRkQzloU0ZJd1kwUnZka3d5U25OaU1tTjFXVE5PYTJKcE5YVmFXRkYyV2tkR2JWcFhOVzVZTWtwellqSmpQUzltYjI1MEx6VmhOa3cxVERKVUwyWnZiblJ6YVhwbEx6UXdNQzltYVd4c0wwa3dTa0pSYTBaRFRVRTlQUzlrYVhOemIyeDJaUzgzTUM5bmNtRjJhWFI1TDFOdmRYUm9SV0Z6ZEE9PS5qcGc%3D.jpg?w=700&webp=1)
版权声明:本文博主原创文章,博客,未经同意不得转载。
java序列化是什么和反序列化和hadoop序列化的更多相关文章
-
hadoop序列化机制与java序列化机制对比
1.采用的方法: java序列化机制采用的ObjectOutputStream 对象上调用writeObject() 方法: Hadoop 序列化机制调用对象的write() 方法,带一个DataOu ...
-
Hadoop序列化与Java序列化
序列化就是把内存中的对象的状态信息转换成字节序列,以便于存储(持久化)和网络传输 反序列化就是就将收到的字节序列或者是硬盘的持久化数据,转换成内存中的对象. 1.JDK的序列化 只要实现了serial ...
-
Hadoop序列化和反序列化
1. 序列化从头说 在面向对象程序设计中,类是个很重要的概念.所谓“类”,可以将它想像成建筑图纸,而对象就是根据图纸盖的大楼.类,规定了对象的一切.根据建筑图纸造房子,盖出来的就是大楼,等同于将 ...
-
Hadoop Serialization hadoop序列化详解(最新版) (1)【java和hadoop序列化比较和writable接口】
初学java的人肯定对java序列化记忆犹新.最开始很多人并不会一下子理解序列化的意义所在.这样子是因为很多人还是对java最底层的特性不是特别理解,当你经验丰富,对java理解更加深刻之后,你就会发 ...
-
Java序列化的作用和反序列化
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ...
-
第12讲-Java中的IO操作及对象的序列化与反序列化
1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1 io操作 1.2.2 对象的序列化与反序列化 2.具体内容 2.1.Java IO 2.1.1.什么是IO IO其实就是输入.输出 I ...
-
Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable
酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...
-
Hadoop序列化
遗留问题: Hadoop序列化可以复用对象,是在哪里复用的? 介绍Hadoop序列化机制 Hadoop序列化机制详解 Hadoop序列化的核心 Hadoop序列化的比较接口 ObjectWrita ...
-
hadoop 序列化源码浅析
1.Writable接口 Hadoop 并没有使用 JAVA 的序列化,而是引入了自己实的序列化系统, package org.apache.hadoop.io 这个包中定义了大量的可 ...
随机推荐
-
JavaWeb_day05cookie_session_HttpSession
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 两个会话的技术cookie session 会话概念 ...
-
Qt之QStringList讲解
QStringList类提供了一个字符串列表 从QString继承而来,它提供快速索引为基础的接入以及快速插入和清除. 成员函数用于操作这个字符串列表如: append(),insert(),repl ...
-
c#学习<;三>;:特性
特性(Attribute) 用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.您可以通过使用特性向程序添加声明性信息.一个声明性标签是通过放置在它所应用的元素前 ...
-
根据ip地址从第三方接口获取详细的地理位置
最近项目某个功能需要根据ip地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾讯的.试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩 ...
-
maven编译时出现读取XXX时出错invalid LOC header (bad signature)
问题原因 该包没有下载正确. 解决办法 找到该包的目录,删除该包重新下载即可. 重新下载后用maven test一下,红叉消失.
-
树链剖分详解(洛谷模板 P3384)
洛谷·[模板]树链剖分 写在前面 首先,在学树链剖分之前最好先把 LCA.树形DP.DFS序 这三个知识点学了 emm还有必备的 链式前向星.线段树 也要先学了. 如果这三个知识点没掌握好的话,树链剖 ...
-
【优秀的素材收藏管理工具】Inboard for Mac 1.1
[简介] Inboard 1.1 版本,Inboard 是一款Mac上强大的设计素材管理器,Inboard功能简洁实用,是设计师必备的一款软件,集成Dribbble,支持从 Safari.Chrome ...
-
Quartz学习记录
参考资料: 官方网站 Quartz使用总结
-
CSS3 图片旋转
.nav_all { position:relative; z-index:; width:172px; display:inline; ; } .nav_all b { display:block; ...
-
windows配置redis(转)
此文章全部是转的,我之前是woidows启动redis无法加载配置找到的:原文链接:http://www.cnblogs.com/smileyearn/articles/4749746.html 在w ...