一、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; } }
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傳遞。