序列化和反序列化的概念

  • 序列化:把对象转换为字节序列的过程称为对象的序列化;
  • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

  1. 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

  2. 在网络上传送对象的字节序列。

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

Kryo的序列化实例
1.引入包

<dependencies><dependency><groupId>com.esotericsoftware</groupId><artifactId>kryo</artifactId><version>3.0.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency></dependencies>

2. 简单的使用
实体类

package com.hwqh.customerkafka.entity;public class User {int id;String name;int age;public User() {}public User(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}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 int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

序列化

 @Testpublic void output() throws FileNotFoundException {User user = new User();user.setId(100);user.setName("测试数据");Kryo kryo = new Kryo();Output output = null;try {output = new Output(new FileOutputStream("user.bin"));kryo.writeObject(output, user);}catch (Exception e){e.printStackTrace();}finally {output.close();}}

kryo反序列化

 @Testpublic void input() throws FileNotFoundException {Kryo kryo = new Kryo();Input input=null;try {input = new Input(new FileInputStream("user.bin"));User user = kryo.readObject(input, User.class);System.out.println(user);}catch (Exception e){e.printStackTrace();}finally {input.close();}}

二、JDK类库中的序列化API

  • ObjectOutputStream代表对象输出流,它的writeObject(Object
    obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

  • ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

举个栗子
实体类

import java.io.Serializable;  public class Person implements Serializable {  private static final long serialVersionUID = 4603642343377807741L;  private int age;  private String name;  private String sex;  public int getAge() {  return age;  }  public void setAge(int age) {  this.age = age;  }  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  public String getSex() {  return sex;  }  public void setSex(String sex) {  this.sex = sex;  }
}

序列化测试类

import java.io.*;
import java.text.MessageFormat;  public class TestObjSerializeAndDeserialize {  public static void main(String[] args) throws Exception {  SerializePerson();//序列化Person对象  Person p = DeserializePerson();//反序列Perons对象  System.out.println(MessageFormat.format("name={0},age={1},sex={2}",  p.getName(), p.getAge(), p.getSex()));  }  private static void SerializePerson() throws FileNotFoundException, IOException {  Person person = new Person();  person.setName("gacl");  person.setAge(25);  person.setSex("男");  // ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作  ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("E:/Person.txt")));  oo.writeObject(person);  System.out.println("Person对象序列化成功!");  oo.close();  }  private static Person DeserializePerson() throws Exception, IOException {  ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("E:/Person.txt")));  Person person = (Person) ois.readObject();  System.out.println("Person对象反序列化成功!");  return person;  }  }

Kryo的基本简单使用相关推荐

  1. 高性能的序列化与反序列化:kryo的简单使用

    前言:kryo是个高效的java序列化/反序列化库,目前Twitter.yahoo.Apache.strom等等在使用该技术,比如Apache的spark.hive等大数据领域用的较多. 为什么使用k ...

  2. 《Spark 官方文档》Spark配置(一)

    Spark配置 Spark有以下三种方式修改配置: Spark properties (Spark属性)可以控制绝大多数应用程序参数,而且既可以通过 SparkConf 对象来设置,也可以通过Java ...

  3. Spark性能调优系列:Spark参数配置大全(官网资料)

    Spark参数配置大全 Spark提供了三个位置来配置系统 Spark属性控制大多数应用程序参数,可以使用SparkConf对象或Java系统属性来设置. 通过conf/spark-env.sh每个节 ...

  4. spark-参数配置总结

    Spark属性控制大多数应用程序设置,并为每个应用程序单独配置.这些属性可以直接在传递给你 的SparkConf上设置 SparkContext.SparkConf允许您通过该set()方法配置一些常 ...

  5. 基于kryo序列化方案的memcached-session-manager多memcached...

    为什么80%的码农都做不了架构师?>>>    上次基于Java IO的序列化方案配置了memcached-session-manager,但是性能不好,现在先简单配置成基于kryo ...

  6. Flink 流式计算在节省资源方面的简单分析

    本文由小米的王加胜同学分享,文章介绍了 Apache Flink 在小米的发展,从 Spark Streaming 迁移到 Flink ,在调度计算与调度数据.Mini batch 与 streami ...

  7. 在Dubbo中使用高效的Java序列化(Kryo和FST)

    作者:沈理 文档版权: Apache 2.0许可证 署名-禁止演绎 完善中-- TODO 生成可点击的目录 目录 序列化漫谈 启用Kryo和FST 注册被序列化类 无参构造函数和Serializabl ...

  8. kryo java_优化Java序列化– Java,XML,JSON,Kryo,POF

    kryo java 也许我很天真,但是我一直认为Java序列化肯定是将Java对象序列化为二进制形式的最快,最有效的方法. 毕竟Java是第7个主要发行版,所以这不是新技术,而且由于每个JDK似乎都比 ...

  9. 优化Java序列化– Java,XML,JSON,Kryo,POF

    也许我很天真,但是我一直认为Java序列化肯定是将Java对象序列化为二进制形式的最快,最有效的方法. 毕竟Java是第7个主要发行版,所以这不是新技术,并且由于每个JDK似乎都比上一个快,因此我错误 ...

最新文章

  1. 五花八门的Shell 的相关概念和配置方法
  2. 北京冬奥又曝黑科技:连气象主播都是AI虚拟人
  3. CPL DPL RPL的区别 一致性代码段和非一致性代码段
  4. python文件下载器代码_GitHub - applechi/pythonCollection: python代码集合(文件下载器、pdf合并、极客时间专栏下载、掘金小册下载、新浪微博爬虫等)...
  5. 驱动人生2008_驱动人生致敬深圳经济特区建立四十周年!
  6. File类对文件的操作应用
  7. 会场安排(nyoj14)
  8. ORACLE中seq$表更新频繁的分析
  9. Android中 requestCode与resultCode的区别与用法
  10. [Python] zeros(r, c)和ones(r, c)和eye(n) 生成特殊矩阵
  11. 数据库性能Quest Performance Analysis Overview
  12. Windows系统微软拾色器小工具
  13. 房聚良源系统功能介绍(SpringBoot)
  14. 3D空间扫描,用立体的眼光看懂世界
  15. Caused by: java.net.BindException: Address already in use: bind
  16. AWS 上的云原生 Jenkins
  17. Flutter实践之高仿有妖气漫画,2021大厂Android开发面试总结+解答
  18. QUIC浅析,android开发者模式
  19. MATLAB求分段函数
  20. 节气生活,邮箱推送,提前预警,告别炎炎夏日下的束手无策

热门文章

  1. 利用C语言求一个数的所有质因数
  2. 免费制作字体软件 - FontForge
  3. android报错:TextView.setText(java.lang.CharSequence)on a null object reference
  4. A. Good Pairs
  5. 密码算法原理与分析:RSA安全与秘钥基础设施
  6. 软考中级-结构化开发
  7. 响应式(自适应屏幕)
  8. Qt-Q_INIT_RESOURCE
  9. 用易康对遥感影像进行面向对象分类
  10. [Go]获取当前时间戳秒/毫秒/纳秒 转成字符串string