Serializable接口:
是java所提供的一个序列化接口,他是一个空接口,为对象提供标准的序列化和反序列化操作,使用Serializable来实现序列化相当简单,只需要在类的声明中指定一个类似下面的标识即可自动实现默认的序列化过程:
private static final long serialVersionUID = 7732742429742974L;
Parcelable接口:
是Android所提供的一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递,这个相对于Serializable比较麻烦,需要重写序列化功能writeToParcel()和describeContents()接口,反序列化功能是由CREATOR实现。
实战
主界面布局实现
<?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="Welcome to Mr wei's blog." />
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Serializable" />
<Button
android:id="@+id/button2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Parcelable" />
</LinearLayout>
定义两个序列化对象
Serializable对象
public class Person implements Serializable {
/**
* UID
*/
private static final long serialVersionUID = -6193614528046609967L;
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;
}
}
Parcelable对象
public class Book implements Parcelable {
private String bookName;
private String author;
private int publishTime;
public int getPublishTime() {
return publishTime;
}
public void setPublishTime(int publishTime) {
this.publishTime = publishTime;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeString(bookName);
parcel.writeString(author);
parcel.writeInt(publishTime);
}
public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel source) {
Book book = new Book();
book.bookName = source.readString();
book.author = source.readString();
book.publishTime = source.readInt();
return book;
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
}
主界面逻辑实现
public class MainActivity extends Activity implements OnClickListener {
private Button mSerializableButton;
private Button mParcelableButton;
public static final String SER_KEY = "net.sunniwell.serializable";
public static final String PAR_KEY = "net.sunniwell.parcelable";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
mSerializableButton.setOnClickListener(this);
mParcelableButton.setOnClickListener(this);
}
private void initView() {
mSerializableButton = (Button) findViewById(R.id.button1);
mParcelableButton = (Button) findViewById(R.id.button2);
}
@Override
public void onClick(View v) {
if (v == mSerializableButton) {
serializableMethod();
} else {
parcelableMethod();
}
}
private void parcelableMethod() {
Book book = new Book();
book.setBookName("IPC进程详解");
book.setAuthor("baowei");
book.setPublishTime(2017);
Intent intent = new Intent(MainActivity.this, ParcelableDemo.class);
Bundle bundle = new Bundle();
bundle.putParcelable(PAR_KEY, book);
intent.putExtras(bundle);
startActivity(intent);
}
private void serializableMethod() {
Person person = new Person();
person.setName("baowei");
person.setAge(25);
Intent intent = new Intent(this, SerializableDemo.class);
Bundle bundle = new Bundle();
bundle.putSerializable(SER_KEY , person);
intent.putExtras(bundle);
startActivity(intent);
}
}
Serializable界面布局实现
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_serializable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_green_dark"
/>
</LinearLayout>
Serializable逻辑实现
public class SerializableDemo extends Activity {
private TextView mTVSerializable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_serializable);
initView();
initData();
}
private void initData() {
Person person = (Person) getIntent().getSerializableExtra(MainActivity.SER_KEY);
mTVSerializable.setText("你的名字" + person.getName() + ",今年" + person.getAge() + "岁");
}
private void initView() {
mTVSerializable = (TextView) findViewById(R.id.tv_serializable);
}
}
Parcelable界面布局实现
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_parcelable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_orange_light"
/>
</LinearLayout>
Parcelable逻辑实现
public class ParcelableDemo extends Activity {
private TextView mTVParcelable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parcelable);
initView();
initData();
}
private void initData() {
Book book = (Book) getIntent().getParcelableExtra(MainActivity.PAR_KEY);
mTVParcelable.setText("Book name is: " + book.getBookName()+"/n"+
"Author is: " + book.getAuthor() + "/n" +
"PublishTime is: " + book.getPublishTime());
}
private void initView() {
mTVParcelable = (TextView) findViewById(R.id.tv_parcelable);
}
}
清单文件配置
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SerializableDemo"></activity>
<activity android:name=".ParcelableDemo"></activity>
</application>
注意事项
- Serializable实现序列化serialVersionUID可以使用程序自己定义生成的值,也可以使用自己的定义,假如数据有什么结构变动,系统序列化和反序列化的serialVersionUID值不一样,就会出现InvalidClassException错误,使用自己的定义的值不会出现这个错误,但是如果数据接口发生颠覆性的变化,也是不行的。
- 静态变量数据属于类不属于对象,所以不会参与序列化过程,使用transient关键字标记的成员变量不参与序列化过程。