序列化与发序列化

一、序列化和反序列化的概念
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

二、什么情况下需要序列化
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候
当你想用套接字在网络上传送对象的时候
当你想通过RMI传输对象的时候

 

试验1-正常序列化和反序列化(不声明serialVersionUID)

上代码:

package com.school.eution.accommodation;

import java.io.*;

public class SerializableTest {
    public static void main(String[] args) throws Exception {
        // 创建对象
        Vehicle vehicle = new Vehicle();
        vehicle.setModel("奥迪360Ti");
        vehicle.setColor("白色");
        vehicle.setCountry("德国");
        vehicle.setSlogan("土豪必备!");

        // 调用序列化方法
        serializeHandle(vehicle);

        // 调用反序列化方法
        Vehicle deserializeVehicle = deserializeHandle();
        System.out.println(deserializeVehicle.toString());
    }

    /**
     * 序列化
     *
     * @author pocher
     */
    private static void serializeHandle(Vehicle vehicle) throws Exception {
        // 将 vehicle 对象存储到d盘的 vehicle.txt 文件中,完成对vehicle 对象的序列化操作
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/vehicle.txt")));
        oos.writeObject(vehicle);
        System.out.println("Vehicle 对象序列化成功!");
        oos.close();
    }

    /**
     * 反序列化
     *
     * @author pocher
     */
    private static Vehicle deserializeHandle() throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:/vehicle.txt")));
        Vehicle vehicle = (Vehicle) ois.readObject();
        System.out.println("Vehicle 对象反序列化成功!");
        return vehicle;
    }

}

 

package com.school.eution.accommodation;

import java.io.Serializable;

public class Vehicle implements Serializable {

    // 购车发票
    private static String INVOICE = "26DAE221";
    // 车辆型号
    private String model;
    // 车辆颜色
    private String color;
    // 车辆国籍
    private String country;
	// 车辆营销标语
	private String slogan;

    public static String getINVOICE() {
        return INVOICE;
    }

    public static void setINVOICE(String INVOICE) {
        Vehicle.INVOICE = INVOICE;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getSlogan() {
        return slogan;
    }

    public void setSlogan(String slogan) {
        this.slogan = slogan;
    }

    @Override
    public String toString() {
        return "Vehicle{" +
                "model='" + model + '\'' +
                ", color='" + color + '\'' +
                ", country='" + country + '\'' +
                ", slogan='" + slogan + '\'' +
                '}';
    }
}

运行结果:

Vehicle 对象序列化成功!
Vehicle 对象反序列化成功!
Vehicle{model='奥迪360Ti', color='白色', country='德国', slogan='土豪必备!'}

分析:不声明serialVersionUID的情况下,序列化和反序列化成功。

 

试验1-序列化成功后,在反序列化前修改对象的属性(不声明serialVersionUID)

将原来的slogan改为slogan2后,发现反序列化时会报错。因此在没有声明 serialVersionUID的时候,不能修改或新增对象属性的时候会报错,换句话说必须保持完全一致才行。

 

-----------------------------声明serialVersionUID----------------------------------

试验3-声明serialVersionUID的情况下修改对象属性

还是先走一遍正常的序列化、反序列化过程

试验4-修改Vehicle对象属性,再进行反序列化。

分析:声明了serialVersionUID后,修改或新增属性不会报错,只是修改或新增的属性由于和原有序列化的属性对应不上,所以是null。INVOICE由于是static修饰的所以,序列化和发序列话对它的值没有影响。

下面奉上代码:

package com.school.eution.accommodation;

import java.io.Serializable;

public class Vehicle implements Serializable {

  private static final long serialVersionUID = 1L;
    // 购车发票
    private static String INVOICE = "222222222";
    // 车辆型号
    private String model;
    // 车辆颜色
    private String color;
    // 车辆国籍
    private String country;
	// 车辆营销标语
	private String slogan2;
    // 车辆售价
	private String salePrice;

    public static String getINVOICE() {
        return INVOICE;
    }

    public static void setINVOICE(String INVOICE) {
        Vehicle.INVOICE = INVOICE;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getSlogan2() {
        return slogan2;
    }

    public void setSlogan2(String slogan2) {
        this.slogan2 = slogan2;
    }

    public String getSalePrice() {
        return salePrice;
    }

    public void setSalePrice(String salePrice) {
        this.salePrice = salePrice;
    }

    @Override
    public String toString() {
        return "Vehicle{" +
                "model='" + model + '\'' +
                ", color='" + color + '\'' +
                ", country='" + country + '\'' +
                ", slogan2='" + slogan2 + '\'' +
                ", salePrice='" + salePrice + '\'' +
                '}';
    }
}
package com.school.eution.accommodation;

import java.io.*;

public class SerializableTest {
    public static void main(String[] args) throws Exception {
       /* // 创建对象
        Vehicle vehicle = new Vehicle();
        vehicle.setModel("奥迪360Ti");
        vehicle.setColor("白色");
        vehicle.setCountry("德国");
        vehicle.setSlogan("土豪必备!");

        // 调用序列化方法
        serializeHandle(vehicle);*/

        // 调用反序列化方法
        Vehicle deserializeVehicle = deserializeHandle();
        System.out.println(deserializeVehicle.toString());
    }

    /**
     * 序列化
     *
     * @author pocher
     */
    private static void serializeHandle(Vehicle vehicle) throws Exception {
        // 将 vehicle 对象存储到d盘的 vehicle.txt 文件中,完成对vehicle 对象的序列化操作
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/vehicle.txt")));
        oos.writeObject(vehicle);
        System.out.println("Vehicle 对象序列化成功!");
        oos.close();
    }

    /**
     * 反序列化
     *
     * @author pocher
     */
    private static Vehicle deserializeHandle() throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:/vehicle.txt")));
        Vehicle vehicle = (Vehicle) ois.readObject();
        System.out.println("Vehicle 对象反序列化成功!");
        return vehicle;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值