解析Android中的Serializable序列化
1、為何要序列化?
-- 把內(nèi)存中的java對(duì)象能夠在磁盤(pán)上持久保存
-- 通過(guò)網(wǎng)絡(luò)傳輸對(duì)象
-- 通過(guò)RMI(Remote Method Invocation 遠(yuǎn)程過(guò)程調(diào)用)傳輸。
通過(guò)序列化可以把對(duì)象轉(zhuǎn)化為與平臺(tái)無(wú)關(guān)的二進(jìn)制流,在重新使用前進(jìn)行反序列化,重新轉(zhuǎn)化為java對(duì)象。
(遠(yuǎn)程過(guò)程調(diào)用針對(duì)分布式Java應(yīng)用,對(duì)開(kāi)發(fā)人員屏蔽不同JVM和網(wǎng)絡(luò)連接等細(xì)節(jié),是的分布在不同JVM上的對(duì)象似乎存在于一個(gè)統(tǒng)一的JVM中,能夠方便的通訊)
2、如何讓Java對(duì)象可以被序列化?
在java里只需讓目標(biāo)類實(shí)現(xiàn)Serializable接口,無(wú)須實(shí)現(xiàn)任何方法。Serializable接口是一種標(biāo)記接口,用來(lái)標(biāo)明某個(gè)類可以被序列化。
3、如何使用序列化與反序列化?
序列化:使用ObjectOutputStream對(duì)象輸出流的writeObject()方法,可以把對(duì)象寫(xiě)到輸出流中。
反序列化:使用ObjectInputStream對(duì)象寫(xiě)入流的readObject()方法,并強(qiáng)制轉(zhuǎn)換為已知的目標(biāo)類即可。
4、對(duì)象引用的序列化
如果一個(gè)類Person某個(gè)成員變量引用了其他類(如class PersonInfo)。即:
class Person implements Serializable{
String name;
PersonInfo info;
}
如果想將Person類進(jìn)行序列化,那么必須要滿足:PersonInfo類也能夠序列化,即也實(shí)現(xiàn)了Serializable接口,
class PersonInfo implements Serializable
5、多個(gè)對(duì)象引用同一個(gè)子對(duì)象
PersonInfo info = new PersonInfo(“male”,"china");
Person xiaomi = new Person("小明",info);
Person dabai = new Person("大白",info);
如果依次對(duì)上面三個(gè)對(duì)象序列化,原本是下面兩個(gè)對(duì)象都指向上面同一個(gè)對(duì)象,也就是指存在一個(gè)info對(duì)象,java為了防止在每個(gè)對(duì)象序列化時(shí)序列化三個(gè)info對(duì)象,設(shè)定了如果多次序列化同一樣java對(duì)象時(shí),只有在第一次序列化時(shí)把這個(gè)對(duì)象轉(zhuǎn)換為字節(jié)序列輸出,之后再對(duì)它序列化只會(huì)指向第一次序列化的編號(hào),而不會(huì)再去序列化這個(gè)對(duì)象。
6、父類序列化
如果父類實(shí)現(xiàn)了Serializable接口,則子類自動(dòng)可序列化,不需要再顯示實(shí)現(xiàn)該接口。
7、利用Serializable保存自定義數(shù)據(jù)至本地的例子
MainActivity如下:
package cc.test.serializable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
/**
* Demo描述:
* 將ArrayList<自定義數(shù)據(jù)>在SDCard上進(jìn)行存取.
*
* Parcelable和Serializable的區(qū)別:
* 內(nèi)存間數(shù)據(jù)傳輸時(shí)推薦使用Parcelable,如activity間傳輸數(shù)據(jù)
* 比如:http://blog.csdn.net/lfdfhl/article/details/10961459
* 保存到本地或者網(wǎng)絡(luò)傳輸時(shí)推薦使用Serializable
*/
public class TestSerializableActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
testSerializable();
}
private void testSerializable() {
FileOutputStream fileOutputStream=null;
ObjectOutputStream objectOutputStream =null;
FileInputStream fileInputStream = null;
ObjectInputStream objectInputStream = null;
ArrayList<Student> studentsArrayList = new ArrayList<Student>();
Student student = null;
for (int i = 1; i < 5; i++) {
student = new Student(i, "小明" + i);
studentsArrayList.add(student);
}
try {
//存入數(shù)據(jù)
File file = new File(Environment.getExternalStorageDirectory().toString()
+ File.separator +"Test"+File.separator + "data.dat");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
fileOutputStream= new FileOutputStream(file.toString());
objectOutputStream= new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(studentsArrayList);
//取出數(shù)據(jù)
fileInputStream = new FileInputStream(file.toString());
objectInputStream = new ObjectInputStream(fileInputStream);
ArrayList<Student> savedArrayList =(ArrayList<Student>) objectInputStream.readObject();
for (int i = 0; i < savedArrayList.size(); i++) {
System.out.println("取出的數(shù)據(jù):" + savedArrayList.get(i).toString());
}
} catch (Exception e) {
// TODO: handle exception
}finally{
if (objectOutputStream!=null) {
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream!=null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (objectInputStream!=null) {
try {
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileInputStream!=null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Student如下:
package cc.test.serializable;
import java.io.Serializable;
public class Student implements Serializable {
private Integer id;
private String name;
//注意定義此字段
public static final long serialVersionUID = 9527L;
public Student() {
super();
}
public Student(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
main.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
- Android序列化之Parcelable和Serializable的使用詳解
- Android Parcelable與Serializable詳解及區(qū)別
- Android Intent傳遞對(duì)象的兩種方法(Serializable,Parcelable)詳細(xì)介紹
- Android中Serializable和Parcelable序列化對(duì)象詳解
- Android 序列化的存儲(chǔ)和讀取總結(jié)及簡(jiǎn)單使用
- 很詳細(xì)的android序列化過(guò)程Parcelable
- Android序列化實(shí)現(xiàn)接口Serializable與Parcelable詳解
相關(guān)文章
Android permission denied原因歸納和解決辦法
大家好,本篇文章主要講的是Android permission denied原因歸納和解決辦法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下哦2021-12-12
Android仿微信5實(shí)現(xiàn)滑動(dòng)導(dǎo)航條
這篇文章主要為大家詳細(xì)介紹了Android仿微信5實(shí)現(xiàn)滑動(dòng)導(dǎo)航條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
Android使用OKHTTP解析JSON數(shù)據(jù)的實(shí)例代碼
本篇文章主要介紹了Android使用OKHTTP解析JSON數(shù)據(jù)的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
flutter開(kāi)發(fā)的app項(xiàng)目?打包成web
如果你的Flutter版本低于2.0,請(qǐng)先升級(jí)Flutter版本,創(chuàng)建一個(gè)web文件夾來(lái)存放web相關(guān)的資源,使用HTML渲染器打包,該渲染器提供的打開(kāi)速度最快,并且具有良好的瀏覽器兼容性,使用默認(rèn)設(shè)置進(jìn)行打包,提供的打開(kāi)速度為一般,但依然保持良好的瀏覽器兼容性2024-08-08
Flutter使用AnimatedOpacity實(shí)現(xiàn)圖片漸現(xiàn)動(dòng)畫(huà)
其實(shí)在Flutter中提供了一些封裝好的動(dòng)畫(huà)組件,以便我們快速應(yīng)用。本文將利用其中的AnimatedOpacity組件實(shí)現(xiàn)圖片漸現(xiàn)動(dòng)畫(huà)效果,需要的可以參考一下2022-03-03
Android進(jìn)階之使用時(shí)間戳計(jì)算時(shí)間差
這篇文章主要為大家詳細(xì)介紹了Android進(jìn)階之使用時(shí)間戳計(jì)算時(shí)間差,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android開(kāi)發(fā)實(shí)現(xiàn)讀取assets目錄下db文件的方法示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)讀取assets目錄下db文件的方法,結(jié)合實(shí)例形式分析了Android針對(duì)assets目錄下SQLite數(shù)據(jù)庫(kù)文件的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Android實(shí)現(xiàn)偵聽(tīng)電池狀態(tài)顯示、電量及充電動(dòng)態(tài)顯示的方法
這篇文章主要介紹了Android實(shí)現(xiàn)偵聽(tīng)電池狀態(tài)顯示、電量及充電動(dòng)態(tài)顯示的方法,非常實(shí)用的功能,需要的朋友可以參考下2014-09-09
Flutter質(zhì)感設(shè)計(jì)之底部導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Flutter質(zhì)感設(shè)計(jì)之底部導(dǎo)航的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08

