首页 > 编程语言 >Java序列化的几种方式

Java序列化的几种方式

时间:2023-02-20 19:04:38浏览次数:51  
标签:f1 f2 Java 几种 User new 序列化 friends

1、原生序列化方式

一、实现Serializable接口(隐式序列化)
这是最简单的序列化方式,会自动序列化所有非staic和transient关键字修饰的成员变量。

二、实现Externalizable接口(显式序列化)

Externalizable接口继承于Serializable,我们在实现该接口时,必须实现writeExternal()和readExternal()方法,而且只能通过手动进行序列化,并且两个方法是自动调用的,因为,这个序列化过程是可控的,可以自己选择哪些部分序列化。

三、实现Serializable接口+添加writeObject()和readObject()方法。(显+隐序列化)

如果想将方式一和方式二的优点都用到的话,可以采用方式三, 先实现Serializable接口,并且添加writeObject()和readObject()方法。注意这里是添加,不是重写或者覆盖。但是添加的这两个方法必须有相应的格式。

方法必须要被private修饰 —–>才能被调用

第一行调用默认的defaultRead/WriteObject() —–>隐式序列化非static和transient

调用read/writeObject()将获得的值赋给相应的值 —–>显式序列化

这种方式结合了显式和隐式序列化,如果有transient修饰的成员变量,也能序列化出来,因为有显式序列化。

2、Json序列化

Json序列化一般会使用Jackson包,通过ObjectMapper类来进行一些操作,比如将对象转化为byte数组或者将json串转化为对象。

package serialize;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * 
 * @author liqqc
 *
 */
public class JsonSerialize {
    public static void main(String[] args) throws IOException {
        new JsonSerialize().start();
    }
 
    public void start() throws IOException {
        User u = new User();
        List<User> friends = new ArrayList<>();
        u.setUserName("张三");
        u.setPassWord("123456");
        u.setUserInfo("张三是一个很牛逼的人");
        u.setFriends(friends);
 
        User f1 = new User();
        f1.setUserName("李四");
        f1.setPassWord("123456");
        f1.setUserInfo("李四是一个很牛逼的人");
 
        User f2 = new User();
        f2.setUserName("王五");
        f2.setPassWord("123456");
        f2.setUserInfo("王五是一个很牛逼的人");
 
        friends.add(f1);
        friends.add(f2);
 
        ObjectMapper mapper = new ObjectMapper();
        Long t1 = System.currentTimeMillis();
        byte[] writeValueAsBytes = null;
        for (int i = 0; i < 10; i++) {
            writeValueAsBytes = mapper.writeValueAsBytes(u);
        }
        System.out.println("json serialize: " + (System.currentTimeMillis() - t1) + "ms; 总大小:" + writeValueAsBytes.length);
        Long t2 = System.currentTimeMillis();
        User user = mapper.readValue(writeValueAsBytes, User.class);
        System.out.println("json deserialize: " + (System.currentTimeMillis() - t2) + "ms; User: " + user);
 
    }
}

3、FastJson序列化

package serialize;
 
import java.util.ArrayList;
import java.util.List;
 
import com.alibaba.fastjson.JSON;
/**
 * 
 * @author liqqc
 *
 */
public class FastJsonSerialize {
 
    public static void main(String[] args) {
        new FastJsonSerialize().start();
    }
 
    public void start(){
        User u = new User();
        List<User> friends = new ArrayList<>();
        u.setUserName("张三");
        u.setPassWord("123456");
        u.setUserInfo("张三是一个很牛逼的人");
        u.setFriends(friends);
 
        User f1 = new User();
        f1.setUserName("李四");
        f1.setPassWord("123456");
        f1.setUserInfo("李四是一个很牛逼的人");
 
        User f2 = new User();
        f2.setUserName("王五");
        f2.setPassWord("123456");
        f2.setUserInfo("王五是一个很牛逼的人");
 
        friends.add(f1);
        friends.add(f2);
 
        //序列化  
        Long t1 = System.currentTimeMillis();
        String text = null;
        for(int i = 0; i<10; i++) {
            text = JSON.toJSONString(u); 
        }
        System.out.println("fastJson serialize: " +(System.currentTimeMillis() - t1) + "ms; 总大小:" + text.getBytes().length);
        //反序列化  
        Long t2 = System.currentTimeMillis();
        User user = JSON.parseObject(text, User.class);
        System.out.println("fastJson serialize: " + (System.currentTimeMillis() -t2) + "ms; User: " + user);
    }
}

4、ProtoBuff序列化

ProtocolBuffer是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化。适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

优点:跨语言;序列化后数据占用空间比JSON小,JSON有一定的格式,在数据量上还有可以压缩的空间。

缺点:它以二进制的方式存储,无法直接读取编辑,除非你有 .proto 定义,否则无法直接读出 Protobuffer的任何内容。

其与thrift的对比:两者语法类似,都支持版本向后兼容和向前兼容,thrift侧重点是构建跨语言的可伸缩的服务,支持的语言多,同时提供了全套RPC解决方案,可以很方便的直接构建服务,不需要做太多其他的工作。 Protobuffer主要是一种序列化机制,在数据序列化上进行性能比较,Protobuffer相对较好。

标签:f1,f2,Java,几种,User,new,序列化,friends
From: https://blog.51cto.com/u_15973676/6069321

相关文章

  • JAVA工具类ObjectUtils.Null
    一、ObjectUtils.Null类作为一个空占位符,其中null具有另外一个含义。例如在HashMap中的HashMap.get(java.lang.Object)方法返回null如果这个Map包含null(也就是有一个ke......
  • Java 8 日期时间 API
    packagenet.shopxx;importjava.text.ParseException;importjava.time.DayOfWeek;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time......
  • 【java】判断一个数是否是质数(面试必考)
    publicclassPrimeNumber{publicstaticvoidmain(String[]args){/*找到2-100之间的所有素数(质数)除了1和本身不能被其他数整除超出......
  • 【java】生成随机验证码方法
    publicclassVerificationCode{/*生成随机验证码*/publicstaticvoidmain(String[]args){Stringcode=generationVeriCode(6);......
  • Java DelayQueue包装类
    publicclassDelayQueueWrapper<T>{privateTimeUnittimeUnit;privatefinalLongcapacity;privatelongcurrentSize;privateDelayQueue<......
  • Java基础知识(23)- Java虚拟机(JVM)- (2) | 常用的 JVM 性能调优监控工具
    在企业级Java应用开发中,Java程序运行过程中会经常遇到内存不足、内存泄露、线程死锁、CPU高占用等问题。部分问题在日常开发中可能会被忽视或被别变通的方法绕开(比如重......
  • JavaScript数组的方法大全(最新)
    JavaScript数组方法大全趁着有时间,总结了下数组所有的属性和方法,记录博客,便于后续使用array.at()at方法,用于获取数组中,对应索引位置的值,不能修改。语法:array.at(cou......
  • mycat 数据丢失的几种原因
    https://github.com/MyCATApache/Mycat-Server/issues/2589问题交流群里面很多同学反馈批量Insert丢数据,此单集中处理问题可能原因1、应用用法错误,因为mycat最新的......
  • 判断JavaScript数据是否为空
    getObjType=(obj)=>{consttype=Object.prototype.toString.call(obj)constarray=type.split(/\s/g)returnarray[1].replace(']','')}is......
  • 万字长文浅析Java集合中的排序算法
    作者:京东物流秦彪1. 引言排序是一个Java开发者,在日常开发过程中随处可见的开发内容,Java中有丰富的API可以调用使用。在Java语言中,作为集合工具类的排序方法,必定要做到通......