前言
1、静态变量无法序列化;
2、transient修饰的变量无法序列化
有些时候我们不需要把对象的全部属性都序列化,就可以使用transient关键字。
3、序列化的好处
序列化的好处包括可以持久化对象,将对象保存在本地磁盘,下次直接读取出来就可以使用;
在远程传输的过程中,除了需要传输文字、图片等等,有时候需要传输对象,而传输对象就需要将其转化为字节,传输在网络上,接收端将其接收到以后再转为对象,而这个过程不需要我们自己实现,只要类实现了Serializable接口就行了,这是个标记接口,没有方法需要我们实现。
下面通过代码来看序列化和反序列化,下面代码功能是将对象序列化存储在本地,然后再反序列化读取到对象。
package cn.zhoucy.serializable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Person implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private int age;
private transient String nickName;
static byte count = 1;
public Person(){
super();
}
public Person(String name, int age,String nickName) {
super();
this.name = name;
this.age = age;
this.nickName = nickName;
count++;
}
public String getInfo(){
return this.name +" "+ this.age+" "+ this.nickName;
}
}
public class SerializableTest {
public static void main(String[] args) throws Exception {
File path = new File("E:/javaA/person");
path.createNewFile();
//先序列化保存到本地
Person p1 = new Person("peter", 12,"littleP");
FileOutputStream fos = new FileOutputStream(path);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p1);
oos.close();
fos.close();
//Person.count = 10;
//开始读出来
FileInputStream fis = new FileInputStream(path);
ObjectInputStream ois = new ObjectInputStream(fis);
Person p2 = (Person)ois.readObject();
ois.close();
fis.close();
System.out.println(p2.getInfo());
System.out.println(p2.count);
}
}
输出结果:
这里有两个点要注意:
1、最后一个nickName属性输出是null,是因为被transient 修饰,所以不会被序列化,故而读出来是null;
2、count属性是static修饰的,按理说是不会被序列化的,为什么这里又会输出2呢?是因为这个测试代码在同一台机器上同一个进程里面,static只保存一份,本地的进程中保存有count的量,所以可以读取出来,如果是远程通信就不会有这种情况了。总之这里输出的count=2并不是因为序列化保存了count属性。如果把注释掉的Person.count = 10;打开,那么控制台打印输出的就会是10。