java get方法不序列化_java常用序列化与反序列化方法
序列化工具类
序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象。
主要的目的是方便传输和存储。
序列化工具类:
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常用序列化与反序列化方法相关推荐
- java继承序列化_java中序列化之子类继承父类序列化
当一个父类实现Serializable接口后,他的子类都将自动的实现序列化. 以下验证了这一点: package Serial; import java.io.Serializable; public ...
- java 方法 函数 区别_Java中的构造函数和方法之间的区别
Java方法一种方法用于探索对象的行为. 我们可以在方法的前面加上访问修饰符. 方法必须具有返回类型,例如void,任何原始类型(int,char,float等),任何Object类型(Integer ...
- java 不同包子类 覆盖_Java中不同方法的覆盖方法
经过测试 覆盖的好处是能够定义特定于子类类型的行为,这意味着子类可以根据其要求实现父类方法. 用面向对象的术语来说,覆盖是指覆盖现有方法的功能. 示例class Animal { public voi ...
- java this关键字的使用_Java this 关键字的使用方法详解
Java this 关键字的使用方法详解 构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个 ...
- java中如何定义一个_java中如何定义一个方法
java中如何定义一个方法 发布时间:2020-06-20 16:39:15 来源:亿速云 阅读:88 作者:Leah java中如何定义一个方法?相信很多新手小白还没学会这个技能,通过这篇文章的总结 ...
- 使用php下载网络图片有哪些方法,php下载网络图片常用的三个方法总结
下面来讲利用PHP下载网络图片常用的三个方法.当然,这三个方法都不是万能的,有时候会因为网络问题,或者网络图片的权限问题(大站一般都有防盗链)导致下载失败. 一起来看看吧,实际工作中经常用到. 方法一 ...
- 使用php下载网络图片有哪些方法,php下载网络图片常用的三个方法总结_后端开发...
php文件锁产生的问题和解决方案(一个真实案例)_后端开发 一个真实案例想起自己之前犯过一个相关的错误.当时场景是这样的:有一个微信公众号项目,调用微信公众号的接口都需要access_token,它的 ...
- linux的常用备份方法,Linux系统下常用的数据备份方法
Linux系统下常用的数据备份方法 发布时间:2009-10-28 15:11:36来源:红联作者:szlfeng Linux系统下常用的数据备份方法 1.本机上数据的手工备份 Linux系统上配有功 ...
- java字典序列化_Java对象序列化,Serialize Java Data Object,音标,读音,翻译,英文例句,英语词典...
补充资料:对象化 标志人类有目的的对象性活动的过程及其结果的哲学范畴.马克思用这个范畴揭示劳动的实现.劳动物化为对象的事实.劳动的实现意味着创造一定的产品,而劳动的产品就是固定在某个对象中物化为对象的 ...
最新文章
- npm安装less报错 rollbackFailedOptional: verb npm-session
- 【USACO 2.1】The Castle
- iOS 转换BGR24 为 RGB24
- 和qc哪个发展更好_城西公司举办2020年度QC成果推广交流发布会
- 浙江省计算机二级办公软件高级应用分值,浙江计算机二级高级办公软件word题分值是多少...
- 大数据开发者必走的学习路线
- 管理新语:不愿意做的事情,与其应付,不如直接明说
- python抽学号程序_Python 9行代码来随机抽学生回答指定问题
- 学计算机买戴尔笔记本哪款,戴尔笔记本大学生用,买哪款比较好?
- 【转贴】会看会做会转换——PDF文件应用宝典-教程-pdf中国
- chrome浏览器使用console代码让115网盘免扫二维码登陆
- 浅谈无线传感器和无线传感器网络
- mysql gbk转utf8_MySQL字符集GBK转换到UTF8
- java-net-php-python-japm中小学生课堂评价系统查重PPT计算机毕业设计程序
- 2020年了,BAT都组建了哪些科技实验室?
- 形态学操作之腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽
- (2) Hive安装
- Android把图片压缩到一定大小并不失真
- docker重启 容器自动重启
- 旅途——Python基本的“生存技能”
热门文章
- micropython开发idethonny_ESP32 Micropython开发利器Thonny IDE介绍
- 使用R语言绘制层次聚类热图
- Visual C++——黄维通《 Visual C++面向对象与可视化程序设计》——习题7-12
- 《数据结构与算法》实验报告——快速排序
- Python——基本统计值计算
- Even Number Theory
- springboot项目中的注解 启动项目的方式 解决spring的bean.xml配置不生效 spring的基础JDBC配置
- anaconda使用记录
- Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】
- PHP对Excel导入导出操作