第二章——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傳遞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM