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

先创建一个 User 实体类做测试

public class User implements Serializable {
//    private static final long serialVersionUID = -1568730003971173026L;
//    @Protobuf(fieldType = FieldType.INT32)
    private Integer userId;
//    @Protobuf(fieldType = FieldType.STRING)
    private String userName;
//    @Protobuf(fieldType = FieldType.DATE)
    private Date userBirth;
    public Date getUserBirth() {
        return userBirth;
    }
    public void setUserBirth(Date userBirth) {
        this.userBirth = userBirth;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userBirth=" + userBirth +
                '}';
    }
}

一、Java 自带序列化

  • 序列化方法
public static void serialize() throws IOException {
    User user = new User();
    user.setUserId(1);
    user.setUserName("序列化");
    user.setUserBirth(new Date());
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user"));
    oos.writeObject(user);
    oos.flush();
    oos.close();
}
  • 反序列化方法
public static void deserialize() throws IOException, ClassNotFoundException {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user"));
    User user = (User) ois.readObject();
    System.out.println(user.getUserName());
}
  • 测试
public static void main(String[] args) throws IOException, ClassNotFoundException {
    serialize();
    deserialize();
}

如果同一个文件再序列化一次的话,文件的大小是不会翻倍,只会在文件写入Header的信息。

二、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);

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

总结

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值