JavaWeb - 一篇带你序列化 & 反序列化之性能对比分析(二)

简介: JavaWeb - 一篇带你序列化 & 反序列化之性能对比分析(二)

二、JSON 序列化

User user = new User();
user.setUserId(10001);
user.setUserName("序列化first");
user.setUserBirth(new Date());
byte[] bytes = null;
long start = System.currentTimeMillis();
// 序列化
ObjectMapper objectMapper = new ObjectMapper();
for (int i = 0 ; i< 10000 ;i++){
   bytes = objectMapper.writeValueAsBytes(user);
}
long end = System.currentTimeMillis();
System.out.println("消耗时间:"+ (end - start) +"ms" );
System.out.println(bytes.length);
// 反序列化
User user1 = objectMapper.readValue(bytes, User.class);
System.out.println(user1);

三、Gson 序列化

User user = new User();
user.setUserId(10001);
user.setUserName("序列化first");
user.setUserBirth(new Date());
long start = System.currentTimeMillis();
String text = "";
Gson gson = new Gson();
// 序列化
for (int i = 0 ; i< 10000 ;i++){
    text = gson.toJson(user);
}
long end = System.currentTimeMillis();
System.out.println("消耗时间:"+ (end - start) +"ms" );
System.out.println(text.getBytes().length);
// 反序列化
User user1 = gson.fromJson(text, User.class);
System.out.println(user1);

四、Fastjson 序列化

User user = new User();
user.setUserId(10001);
user.setUserName("序列化first");
user.setUserBirth(new Date());
byte[] bytes = null;
long start = System.currentTimeMillis();
// 序列化
String text = null;
for (int i = 0 ; i< 10000 ;i++){
    text = JSON.toJSONString(user);
}
long end = System.currentTimeMillis();
System.out.println("消耗时间:"+ (end - start) +"ms" );
System.out.println(text.getBytes().length);
// 反序列化
User user1 = JSON.parseObject(text, User.class);
System.out.println(user1);  

五、百度 ProtoBuff 序列化

注意:使用这个的时候 user 实体类需要加上 @Protobuff

User user = new User();
user.setUserId(10001);
user.setUserName("序列化first");
user.setUserBirth(new Date());
long start = System.currentTimeMillis();
byte[] encode = null;
Gson gson = new Gson();
Codec<User> userCodec = ProtobufProxy.create(User.class);
// 序列化
for (int i = 0 ; i< 10000 ;i++){
    encode = userCodec.encode(user);
}
long end = System.currentTimeMillis();
System.out.println("消耗时间:"+ (end - start) +"ms" );
System.out.println(encode.length);
// 反序列化
User decode = userCodec.decode(encode);
System.out.println(decode);

六、Kryo 序列化

注意:  原来的旧版本不需要,但是新版本 需要加上 这行进行注册,  kryo.register(User.class, new JavaSerializer());

不然会有报错信息

java.lang.IllegalArgumentException: Class is not registered: org.example.nativenal.domian.User

Note: To register this class use: kryo.register(org.example.nativenal.domian.User.class);

User user = new User();
user.setUserId(10001);
user.setUserName("序列化first");
// user.setUserBirth(new Date());
long start = System.currentTimeMillis();
Kryo kryo = new Kryo();
kryo.register(User.class, new JavaSerializer());
Output output = null;
output = new Output(new FileOutputStream("kryo"));
kryo.writeObject(output, user);
long end = System.currentTimeMillis();
System.out.println("消耗时间:"+ (end - start) +"ms" );
System.out.println(new File("kryo").length());
// 反序列化
Input Input = new Input(new FileInputStream("kryo"));
User user1 = kryo.readObject(Input, User.class);
System.out.println(user1);

在网络传输中文件越小传输的速度越快。

总结

image.png

目录
相关文章
|
5月前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
528 4
|
2月前
|
存储 Java 大数据
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
3月前
|
数据采集 搜索推荐 算法
Java 大视界 -- Java 大数据在智能教育学习社区用户互动分析与社区活跃度提升中的应用(274)
本文系统阐述 Java 大数据技术在智能教育学习社区中的深度应用,涵盖数据采集架构、核心分析算法、活跃度提升策略及前沿技术探索,为教育数字化转型提供完整技术解决方案。
|
3月前
|
Java 数据库连接 API
互联网大厂校招 JAVA 工程师笔试题解析及常见考点分析
本文深入解析互联网大厂校招Java工程师笔试题,涵盖基础知识(数据类型、流程控制)、面向对象编程(类与对象、继承与多态)、数据结构与算法(数组、链表、排序算法)、异常处理、集合框架、Java 8+新特性(Lambda表达式、Stream API)、多线程与并发、IO与NIO、数据库操作(JDBC、ORM框架MyBatis)及Spring框架基础(IoC、DI、AOP)。通过技术方案讲解与实例演示,助你掌握核心考点,提升解题能力。
152 2
|
4月前
|
存储 安全 IDE
说一说序列化与反序列化中存在的问题
本文详细解析了Java中的序列化机制,包括序列化的概念、实现方式及应用场景。通过Student类的实例演示了对象的序列化与反序列化过程,并分析了`Serializable`接口的作用以及`serialVersionUID`的重要意义。此外,文章还探讨了如何通过自定义`readObject()`方法增强序列化的安全性,以及解决可序列化单例模式中可能产生的多实例问题。最后提供了代码示例和运行结果,帮助读者深入理解序列化的原理与实践技巧。
110 2
|
4月前
|
人工智能 Java
Java参数传递分析
本文详细探讨了Java中参数传递的机制,明确指出Java采用的是值传递而非引用传递。通过基本数据类型(如int)和引用类型(如Map、自定义对象People)的实例测试,证明方法内部对参数的修改不会影响原始变量。即使在涉及赋值返回的操作中,表面上看似引用传递,实际仍是值传递的结果。文中结合代码示例与执行结果,深入解析了值传递的本质及容易引起混淆的情形,帮助读者准确理解Java参数传递的核心概念。
|
传感器 分布式计算 安全
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。
|
4月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
4月前
|
缓存 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析
活锁:多个线程相互影响对方退出同步代码块的条件而导致线程一直运行的情况。例如,线程1的退出条件是count=5,而线程2和线程3在其代码块中不断地是count进行自增自减的操作,导致线程1永远运行。内存一致性问题:由于JIT即时编译器对缓存的优化和指令重排等造成的内存可见性和有序性问题,可以通过synchronized,volatile,并发集合类等机制来解决。这里的线程安全是指,多个线程调用它们同一个实例的方法时,是线程安全的,但仅仅能保证当前调用的方法是线程安全的,不同方法之间是线程不安全的。
83 0
|
4月前
|
Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(3-2):并发共享问题的解决与分析
wait方法和notify方法都是Object类的方法:让当前获取锁的线程进入waiting状态,并进入waitlist队列:让当前获取锁的线程进入waiting状态,并进入waitlist队列,等待n秒后自动唤醒:在waitlist队列中挑一个线程唤醒:唤醒所有在waitlist队列中的线程它们都是之间协作的手段,只有拥有对象锁的线程才能调用这些方法,否则会出现IllegalMonitorStateException异常park方法和unpark方法是LockSupport类中的方法。
85 0