java对象的序列化和反序列化

Posted inspire0x001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java对象的序列化和反序列化相关的知识,希望对你有一定的参考价值。

一,对象的序列化,反序列化
1.对象的序列化,就是将Object转换成byte序列,反之叫对象的反序列化
2.做序列化需要有流类,序列化流(ObjectOutputStream),是(字节的)过滤流,有writeObject方法,写一个对象
反序列化 流(ObjectInputStream)----readObject
3.序列化接口(Serializable)
对象必须实现序列化接口,才能进行序列化,否则将出现异常
这个接口,没有任何方法,只是一个标准
 /**
         * 如果将来希望这个对象能在网络中传输,也需要把这个对象进行序列化。(在网络中是以字节为单位进行传输的)
         * 所以当我们要保存这个对象,或在网络中传输这个对象时,都需要对这个对象进行序列化
         */
二,transient关键字
一个对象中有些属性不需要序列化,可以用transient关键子修饰。
用transient修饰的元素,该元素不会进行jvm默认的序列化。也可以自己完成这个元素的序列化
(在网络传输中,有些元素不需要传输,也就不用序列化,这样可以节省网络传输的流量)
如何自己完成序列化呢?
有两个方法签名可以实现。可以参考ArrayList里的两个方法 :
writeObject(java.io.ObjectOutputStream s),readObject(java.io.ObjectInputStream s)

ArrayList序列化优化的问题(ArrayList源码)
ArrayList底层是数组,但我们往list中添加数据时,有添加不满的情况。数组中为空的元素就不用序列化了,这样可以提高性能

package com.amazing.jdk.learn2Serializable.basicSerializable_08_15;

import java.io.Serializable;

/**
 * Created by yaming on 17-8-15.
 */
public class Student implements Serializable {
    private Long id;
    private String name;
    private char gender;
    private transient double money;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name=‘" + name + ‘\‘‘ +
                ", gender=" + gender +
                ", money=" + money +
                ‘}‘;
    }

    //自己实现序列化
    private void writeObject(java.io.ObjectOutputStream s)
            throws java.io.IOException{
        s.defaultWriteObject();//把jvm能默认序列化的元素进行序列化
        s.writeDouble(money);//自己完成money的序列化,也可以用s.writeObject(money)
    }
    //自己实现反序列化
    private void readObject(java.io.ObjectInputStream s)
            throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();//把jvm能默认反序列化的元素进行反序列化
        this.money=s.readDouble();//自己完成money的反序列化
    }
}

 





























以上是关于java对象的序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章

java反序列化引起的内存溢出怎么解决

一文带你全面了解java对象的序列化和反序列化

java序列化和反序列化

HashMap(key,Object)中的Java Gson序列化和反序列化对象[重复]

Java基础学习总结——Java对象的序列化和反序列化

Java序列化和反序列化——田少嵩