对象序列化和反序列化

1.定义

序列化serialization是将对象信息转变成可以存储和传递的信息的过程,反之则为反序列化。

序列化: 对象变成字节数组。

反序列化:字节数组变成对象。

2.序列化机制

对象必须实现了Serializable接口才能进行序列化,否则会报异常:NotSerializableException。

package com.hollischaung.serialization.SerializableDemos;
import java.io.Serializable;
/**
 * Created by hollis on 16/2/17.
 * 实现Serializable接口
 */
public class User1 implements Serializable {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

package com.hollischaung.serialization.SerializableDemos;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import java.io.*;
/**
 * Created by hollis on 16/2/17.
 * SerializableDemo1 结合SerializableDemo2说明 一个类要想被序列化必须实现Serializable接口
 */
public class SerializableDemo1 {

    public static void main(String[] args) {
        //Initializes The Object
        User1 user = new User1();
        user.setName("hollis");
        user.setAge(23);
        System.out.println(user);

        //Write Obj to File
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("tempFile"));
            oos.writeObject(user);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(oos);
        }

        //Read Obj from File
        File file = new File("tempFile");
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream(file));
            User1 newUser = (User1) ois.readObject();
            System.out.println(newUser);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(ois);
            try {
                FileUtils.forceDelete(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

//OutPut:
//User{name='hollis', age=23}
//User{name='hollis', age=23}

 3.

序列化ID

SerialVersionUID

有两个生成策略:默认SerialVersionUID=1L;或者SerialVersionUID是随机生成的一个数。

那么SerialVersionUID有什么用呢?它可以在序列化、反序列化的时候检测版本是否一致,通过改变序列化ID来限制某些对象的使用。

4.

transient关键字

当某个属性被声明为transient的时候,该对象序列化的时候就会忽略该字段

5.

使用ObjectInputStream和ObjectOutputStream来进行文件的读写。

6.

JAVA序列化的高级认识

https://www.ibm.com/developerworks/cn/java/j-lo-serial/

posted @ 2017-03-17 11:20  纯丿乱  阅读(206)  评论(1编辑  收藏  举报