序列化工具类

序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象。

主要的目的是方便传输和存储。

序列化工具类:

public class SerializeUtil {

private static Map, Schema>> cachedSchema = new ConcurrentHashMap<>();

private static Objenesis objenesis = new ObjenesisStd(true);

/**

* jdk 序列化工具的序列化与反序列化

*

* @param object

* @return

* @throws IOException

*/

public static byte[] JDKObjectToBytes(Object object) throws IOException {

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

ObjectOutput objectOutput = new ObjectOutputStream(byteArrayOutputStream);

objectOutput.writeObject(object);

return byteArrayOutputStream.toByteArray();

}

public static T JDKBytesToObject(byte[] bytes, Class clazz) throws Exception {

ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));

Object object = objectInputStream.readObject();

return (T) object;

}

/**

* 使用fastjson实现序列化和反序列化

*

* @param object

* @return

*/

public static byte[] FastJsonObjectToBytes(Object object) {

byte[] bytes = JSON.toJSONBytes(object);

return bytes;

}

/**

* fastjosn反序列化时,class必须要有默认构造函数,否则报错

* @param bytes

* @param clazz

* @param

* @return

*/

public static T FastJsonBytesToObject(byte[] bytes, Class clazz) {

return (T) JSON.parseObject(bytes, clazz);

}

/**

* 使用protostuff序列化

* @param obj

* @param

* @return

*/

public static byte[] serialize(T obj) {

Class cls = (Class) obj.getClass();

LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);

try {

Schema schema = getSchema(cls);

return ProtostuffIOUtil.toByteArray(obj, schema, buffer);

} catch (Exception e) {

throw new IllegalStateException(e.getMessage(), e);

} finally {

buffer.clear();

}

}

public static T deserialize(byte[] data, Class cls) {

try {

T message = objenesis.newInstance(cls);

Schema schema = getSchema(cls);

ProtostuffIOUtil.mergeFrom(data, message, schema);

return message;

} catch (Exception e) {

throw new IllegalStateException(e.getMessage(), e);

}

}

/**

* 缓存schema

* @param cls

* @param

* @return

*/

private static Schema getSchema(Class cls) {

Schema schema = (Schema) cachedSchema.get(cls);

if (schema == null) {

schema = RuntimeSchema.createFrom(cls);

if (schema != null) {

cachedSchema.put(cls, schema);

}

}

return schema;

}

}

此类分别包含jdk序列化、fastjson序列化、protobuf序列化三种序列化方式。

注意prostuff需要包含maven依赖:

org.objenesis

objenesis

2.6

io.protostuff

protostuff-core

1.4.0

io.protostuff

protostuff-runtime

1.4.0

com.alibaba

fastjson

1.2.31

使用

首先定义一个类用于测试,注意此类没有默认构造函数。

public class Monster implements Serializable{

Integer hp;

Integer mp;

String name;

Integer level;

public Monster(String name,Integer level){

this.name=name;

this.level=level;

}

//省略getter、setter、hashCode、equals...

}

测试类:

public class SerializeUtilTest {

Monster monster = new Monster("boss", 100);

Class clazz = Monster.class;

@Test

public void jdkSerializeTest() throws Exception {

byte[] bytes = SerializeUtil.JDKObjectToBytes(monster);

System.out.println(bytes.length);

Monster object = SerializeUtil.JDKBytesToObject(bytes,clazz);

Assert.assertEquals(object, monster);

}

@Test(expected = com.alibaba.fastjson.JSONException.class)

public void fastJsonSerializeTest(){

byte[] bytes = SerializeUtil.FastJsonObjectToBytes(monster);

System.out.println(bytes.length);

Monster object = SerializeUtil.FastJsonBytesToObject(bytes,clazz);

Assert.assertEquals(object, monster);

}

@Test

public void serialize(){

byte[] serialize = SerializeUtil.serialize(monster);

System.out.println(serialize.length);

Object deserialize = SerializeUtil.deserialize(serialize, clazz);

Assert.assertEquals(deserialize,monster);

}

}

输出分别为199、27、8。

可以看出jdk默认序列化方式的效率极低,protobuf效率和字节都非常高效。

特别注意:fastjson反序列化的对象必须要有默认构造函数,否则会报错。protostuff使用objenesis不需要默认构函数创建对象。但是json格式可读性好,性能也还可以,推荐性能不高的场景优先json格式,对性能要求高的场景使用protostuff。

java get方法不序列化_java常用序列化与反序列化方法相关推荐

  1. java继承序列化_java中序列化之子类继承父类序列化

    当一个父类实现Serializable接口后,他的子类都将自动的实现序列化. 以下验证了这一点: package Serial; import java.io.Serializable; public ...

  2. java 方法 函数 区别_Java中的构造函数和方法之间的区别

    Java方法一种方法用于探索对象的行为. 我们可以在方法的前面加上访问修饰符. 方法必须具有返回类型,例如void,任何原始类型(int,char,float等),任何Object类型(Integer ...

  3. java 不同包子类 覆盖_Java中不同方法的覆盖方法

    经过测试 覆盖的好处是能够定义特定于子类类型的行为,这意味着子类可以根据其要求实现父类方法. 用面向对象的术语来说,覆盖是指覆盖现有方法的功能. 示例class Animal { public voi ...

  4. java this关键字的使用_Java this 关键字的使用方法详解

    Java this 关键字的使用方法详解 构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个 ...

  5. java中如何定义一个_java中如何定义一个方法

    java中如何定义一个方法 发布时间:2020-06-20 16:39:15 来源:亿速云 阅读:88 作者:Leah java中如何定义一个方法?相信很多新手小白还没学会这个技能,通过这篇文章的总结 ...

  6. 使用php下载网络图片有哪些方法,php下载网络图片常用的三个方法总结

    下面来讲利用PHP下载网络图片常用的三个方法.当然,这三个方法都不是万能的,有时候会因为网络问题,或者网络图片的权限问题(大站一般都有防盗链)导致下载失败. 一起来看看吧,实际工作中经常用到. 方法一 ...

  7. 使用php下载网络图片有哪些方法,php下载网络图片常用的三个方法总结_后端开发...

    php文件锁产生的问题和解决方案(一个真实案例)_后端开发 一个真实案例想起自己之前犯过一个相关的错误.当时场景是这样的:有一个微信公众号项目,调用微信公众号的接口都需要access_token,它的 ...

  8. linux的常用备份方法,Linux系统下常用的数据备份方法

    Linux系统下常用的数据备份方法 发布时间:2009-10-28 15:11:36来源:红联作者:szlfeng Linux系统下常用的数据备份方法 1.本机上数据的手工备份 Linux系统上配有功 ...

  9. java字典序列化_Java对象序列化,Serialize Java Data Object,音标,读音,翻译,英文例句,英语词典...

    补充资料:对象化 标志人类有目的的对象性活动的过程及其结果的哲学范畴.马克思用这个范畴揭示劳动的实现.劳动物化为对象的事实.劳动的实现意味着创造一定的产品,而劳动的产品就是固定在某个对象中物化为对象的 ...

最新文章

  1. npm安装less报错 rollbackFailedOptional: verb npm-session
  2. 【USACO 2.1】The Castle
  3. iOS 转换BGR24 为 RGB24
  4. 和qc哪个发展更好_城西公司举办2020年度QC成果推广交流发布会
  5. 浙江省计算机二级办公软件高级应用分值,浙江计算机二级高级办公软件word题分值是多少...
  6. 大数据开发者必走的学习路线
  7. 管理新语:不愿意做的事情,与其应付,不如直接明说
  8. python抽学号程序_Python 9行代码来随机抽学生回答指定问题
  9. 学计算机买戴尔笔记本哪款,戴尔笔记本大学生用,买哪款比较好?
  10. 【转贴】会看会做会转换——PDF文件应用宝典-教程-pdf中国
  11. chrome浏览器使用console代码让115网盘免扫二维码登陆
  12. 浅谈无线传感器和无线传感器网络
  13. mysql gbk转utf8_MySQL字符集GBK转换到UTF8
  14. java-net-php-python-japm中小学生课堂评价系统查重PPT计算机毕业设计程序
  15. 2020年了,BAT都组建了哪些科技实验室?
  16. 形态学操作之腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽
  17. (2) Hive安装
  18. Android把图片压缩到一定大小并不失真
  19. docker重启 容器自动重启
  20. 旅途——Python基本的“生存技能”

热门文章

  1. micropython开发idethonny_ESP32 Micropython开发利器Thonny IDE介绍
  2. 使用R语言绘制层次聚类热图
  3. Visual C++——黄维通《 Visual C++面向对象与可视化程序设计》——习题7-12
  4. 《数据结构与算法》实验报告——快速排序
  5. Python——基本统计值计算
  6. Even Number Theory
  7. springboot项目中的注解 启动项目的方式 解决spring的bean.xml配置不生效 spring的基础JDBC配置
  8. anaconda使用记录
  9. Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】
  10. PHP对Excel导入导出操作