首页 > 技术文章 > java 序列化--反序列化

alomsc 2020-12-24 15:51 原文

先创建一个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 序列化 (消耗时间:131ms,文件大小 :82 字節)

     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(消耗时间:97ms ,文件大小 :70 字节)

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(消耗时间:484ms,文件大小:26)

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

   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 (消耗时间:99ms,文件大小:243)

注意:  原来的旧版本不需要,但是新版本 需要加上 这行进行注册,  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);

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

 

 

推荐阅读