首页 > 编程语言 > 详细

java 序列化--反序列化

时间:2020-12-24 16:59:37      阅读:24      评论:0      收藏:0      [点我收藏+]

先创建一个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);

整体下来其实可以知道 使用 ProtoBuff 生成的序列化文件大小是最小的,在网络传输中文件越小传输的速度越快

 

java 序列化--反序列化

原文:https://www.cnblogs.com/alomsc/p/14184511.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!