所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得所有问题。
1.将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;
2、按值将对象从一个应用程序域发送至另一个应用程序域。
实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没实现序列化怎么才能进行网络传输呢,要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化,如果你不需要分布式应用,那就没那个必要实现序列化
3.什么情况下需要序列化
a)当你想把的内存中的对象写入到硬盘的时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
再稍微解释一下:a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。
Serializable与Parcelable的区别
Serializable和Parcelable类型代表一个可序列化的对象
使用例子
serializable
public class aa implements Serializable{
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
package com.lcb.one.bean;
import android.os.Parcel;
import android.os.Parcelable;
public class aa implements Parcelable {
private String name;
private int age;
private boolean isTure;
private boolean pass;
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;
}
@Override
public int describeContents() {
//内容描述接口,基本不用管
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//写入接口函数,打包
dest.writeString(name);
dest.writeInt(age);
dest.writeByte(pass ? (byte) 1 : (byte) 0);
dest.writeValue(isTure);
}
/*当出现:
According to the Parcelable interface documentation, "Classes implementing the Parcelable interface must also have a" +
" static field called CREATOR, which is an object implementing the Parcelable.Creator interface."
(根据Parcelable接口文档,“实现Parcelable接口的类还必须有一个名为CREATOR的静态字段,它是实现Parcelable.Creator接口的对象。”)*/
//你就要建立如下内容:
public static final Creator<aa> CREATOR = new Creator<aa>() {
@Override
public aa createFromParcel(Parcel source) {
//读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入
//为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例
aa mPerson = new aa();
mPerson.name = source.readString();
mPerson.age = source.readInt();
mPerson.pass = source.readByte() != 0;
mPerson.isTure= (boolean) source.readValue(Boolean.class.getClassLoader());
return mPerson;
}
@Override
public aa[] newArray(int size) {
return new aa[size];
}
};
}