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

时间:2023-02-17 13:57:12

一,对象的序列化,反序列化
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的反序列化
}
}