Java序列化与反序列化

前言

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值