第二章——Serializable的使用(跨进程使用和Intent的传递对象)

一、Serializable类(JAVA本身具有的)

简介:Serializable是一个接口。

作用:是JAVA提供的序列化接口,实现序列化和反序列化的操作。

二、跨进程使用

1.事前准备

public class Book implements Serializable {

    //注:此段可写也可不写 —— 稍后讲解 ①
    private static final long serialVersionUID = 13165131351L;

    private String mBookName;
    private int mBookId;
/**
*准备:创建Book类,并继承Seriaizable接口
* */

    public Book(int bookId, String bookName) {
        mBookId = bookId;
        mBookName = bookName;
    }

    @Override
    public String toString() {
        return mBookId+""+mBookName;
    }
}
View Code

2.序列化与反序列化

//序列化过程
Book book = new Book(123,"Android 开发艺术探索");
FileOuputStream fos = new FileOutputStream("test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(book);
oss.close();



//反序列化过程
FileInputStream fis = new FileInputStream("test.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Book newBook = (Book)ois.readObject();
ois.close();

注:反序列化之后对象book与newBook数据相同,但两者不是同一个对象。

3.原理

当序列化的时候,系统会把当前类的serialVersionUID写入序列化的文件中,当反序列化的时候系统回去检测文件中的serivalVersionUID是否与当前类的serivalVersionUID相同,如果不相同就会反序列化失败。

回答①:当我们继承Serializable的时候,系统会自动提供一个serialVersionUID值,但是当该类中有改变(如:成员变量 减少或者增加,我们将类拿去修改)就会改变系统提供的serialVersionUID值。

但是,如果自己设置了serialVerionUID的值,当成员变量、方法 减少或者增加的时候,因为反序列化的是之前没有改变类的序列化,所以系统会尽可能恢复多的数据。如果改变类名和成员变量的类型,就还是会反序列化失败(结构都变了)。

注:静态成员、用transient标记的成员变量不进行序列化

三、Intent之间传递Serializable类(各个Activity传递对象的方法)

//MainActivity.java
Book book = new Book(123, "android开发艺术探索");
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("book",book);
startActivity(intent);

//SecondActivity.java
Intent intent = getIntent();
Book book = intent.getSerializableExtra("book");

只需要让对象继承Serializable接口就可以了,之后就用Intent传递。

posted @ 2016-03-31 17:27  技术丶从积累开始  阅读(2179)  评论(0编辑  收藏  举报