熟悉Java的朋友应该知道Java有一个叫序列化的技术,即把一个Object转换为可保存,可传输的流数据。相应的,同时存在反序列化,即将流数据转换为Object类,而在转换的过程中,该Object保持者其自身的状态。不会应该序列化或者反序列化而丢失。通常在缓存中,RPC(远程调用),或者长久保存会话信息时,大有用处。

关于序列化的时候,大部分情况下想到的是对于需要序列化的对象实现Serializable标志接口,同时为该对象提供一个唯一的serialVersionUID。

示例代码

public class Person implements Serializable { private static final long serialVersionUID = -763618247875550322L; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;  public class WhySerialversionUID { public static void main(String[] args) throws Exception { //这里是把对象序列化到文件 Person crab = new Person(); crab.setName("kaka"); ObjectOutputStream oo = new ObjectOutputStream (new FileOutputStream("kakaFile")); oo.writeObject(crab); oo.close(); //这里是把文件序列化到对象 ObjectInputStream oi = new ObjectInputStream (new FileInputStream("kakaFile")); Person kaka = (Person) oi.readObject(); //输出为Hi, My name is kaka System.out.println("Hi, My name is " + kaka.getName()); oi.close(); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

看起来使用JDK提供的序列化技术没有什么问题,其实不然。JDK提供的序列化技术相对而已效率较低。在转换二进制数组过程中空间利用率较差。github上有个专门对比序列化技术做对比的数据:https://github.com/eishay/jvm-serializers/wiki

其中看的出来性能最优的为google开发的colfer 。这个框架尽管性能优秀,但它太过于灵活,灵活到Schema都要开发者自己指定,所以对开发者不是很友好。我推荐使用Protostuff,其性能稍弱与colfer,但对开发者很友好,同时性能远远高于JDK提供的Serializable。

添加依赖:

        <dependency><groupId>io.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.4.4</version> </dependency> <dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.4.4</version> </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

简单使用:

private static RuntimeSchema<Person> schema = RuntimeSchema.createFrom(Person.class);
/**
*序列化
*/
Person crab = new Person();
crab.setName("kaka"); //参数三缓冲器 byte[] bytes = ProtostuffIOUtil.toByteArray(crab,schema,LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); /** *反序列化 */ // 空对象 Person newCrab = schema.newMessage(); ProtostuffIOUtil.mergeFrom(bytes,newCrab,schema); System.out.println("Hi, My name is " + newCrab.getName());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

转载于:https://www.cnblogs.com/firstdream/p/7809357.html

Java序列化技术性能分析(JDK原生与Protostuff)相关推荐

  1. Java 序列化之 Externalizable

    相关文章: Java 序列化 之 Serializable JDK中除了提供 Serializable 序列化接口外,还提供了另一个序列化接口Externalizable,使用该接口之后,之前基于Se ...

  2. Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)

    文章目录 前言 一.Kryo序列化(优先选择) 介绍 快速开始 测试 二.JDK原生序列化 介绍 快速开始 测试 三.Protobuf序列化 介绍 快速开始 测试 四.ProtoStuff 介绍 快速 ...

  3. Java拾遗:004 - JDK、Hadoop、Hessian序列化

    2019独角兽企业重金招聘Python工程师标准>>> JDK序列化 在分布式架构中,序列化是分布式的基础构成之一,我们需要把单台设备上的数据通过序列化(编码.压缩)后通过网络传输给 ...

  4. java jdk 序列化_JDK 11:Java序列化的终结开始了吗?

    java jdk 序列化 在博客文章" 将Google的协议缓冲区与Java结合使用 "中,我引用了乔什·布洛赫(Josh Bloch)的第三版的有效Java ,他写道:" ...

  5. JDK 11:Java序列化的终结开始了吗?

    在博客文章" 将Google的协议缓冲区与Java结合使用 "中,我引用了乔什·布洛赫(Josh Bloch)的第三版的有效Java ,他写道:"没有理由在您编写的任何新 ...

  6. java jocky 下载,jocky1.0.3 (原joc) java混淆器 去除jdk版本限制

    这是jocky1.0.3 (原joc) java混淆器 去除jdk版本限制下载,不支持现在的1.6.1.7等更高版本,现在我把某部分限制代码从class文件里面去除了,测试过可以用,更详细的说明在压缩 ...

  7. Java序列化机制——protoStuff

    Java的序列化是在文件传输中必不可少的一部分.常用的Java序列化机制有Java默认的序列化机制,谷歌的protobuf等.而Java默认的序列化机制效率太低,protobuf要写protostuf ...

  8. java序列化机制之protoStuff

    之前曾经写了两篇java的序列的机制,一种是默认的java序列化机制,这种方式效率太低.另外一种是谷歌的protobuf,但是这种我们还要写proto文件,并且我们还要使用工具来编译生成java文件, ...

  9. java protostuff 好处,java序列化Protostuff和Serializable的区别

    java序列化Protostuff和Serializable的区别 关注:146  答案:1  mip版 解决时间 2021-01-25 06:11 提问者你若离去丶巴掌扇去 2021-01-24 0 ...

  10. Java序列化——JDK序列化与Json序列化

    Java原生序列化 Java原生序列化我们可能会了解的比较多,Java类通过实现Serializable接口来实现该类对象的序列化,这个接口非常特殊,没有任何方法,只起标识作用.Java序列化保留了对 ...

最新文章

  1. lucene之创建索引代码
  2. 微信 for Mac 3.1.0 测试版发布(附安装包),新增「发朋友圈」功能
  3. ★LeetCode(39)——组合总和(JavaScript)
  4. win10安装ubuntu子系统,然后安装python3.6
  5. 应用安全-软件安全-漏洞CVE整理
  6. 使用代码辅助生成工具CodeSmith -- 生成NHibernate的映射文件
  7. WinForm BackgroundWorker笔记
  8. RAID环境中增加容量-在线扩容
  9. Android7.0 MessageQueue
  10. iOS屏幕旋转与锁屏
  11. 山景BP1048使用记录
  12. 【微信退款】Java实现微信APP退款和JSAPI退款流程
  13. Python 爬取优美图库图片
  14. 计算机组成原理 定点加法、减法 练习题
  15. Django入门(一)
  16. 模拟光源 html5,光照渲染——用canvas模拟光照效果
  17. 2017.08.10小结
  18. FM知名芯片商芯略总裁因侵权被警方拘留
  19. 51单片机中断与计时器
  20. Python 图像中颜色替换

热门文章

  1. [测试模式]Setup方法的滥用
  2. pip 安装 pytorch环境
  3. Microsoft Visual C++ 14.0 is required (Unable to find vcvarsall.bat)
  4. 【比赛经验】ALL in BERT:一套操作冲进排行榜首页
  5. 【AAAI2021】自动跨主题作文属性评分
  6. 深度学习框架如何优雅的做算子对齐任务?
  7. 【每日算法Day 100】字节跳动 AI Lab 面试编程题(三道)
  8. 智能问答系统方法综述
  9. 云单元架构,如何赋能数字化转型呢?
  10. 测试的第三重境界:挑战零缺陷