Serializable
JDK提供序列化的标记接口,主要用于对象的持久化存储和网络传输。
通过反射序列化,过程中产生大量的临时变量,导致虚拟机频繁gc,性能消耗比较大。
静态方法属性类而不属于对象,不会被序列化
被关键字Transient修饰的成员变量不会被自动序列化
自定义类作为成员变量,如果未实现Serializable,它的成员变量不会被序列化。
创建Serializable对象比较简单:
public class Book implements Serializable{
private static final long serialVersionUID = 1L;
public String bookName;
public String bookId;
public float bookPrice;
}
需要注意的是serialVersionUID,反序列化时,当前类的serialVersionUID必须和序列化时的serialVersionUID相同才能序列化,否则会出现异常。
序列化写文件:
Book book=new Book();
book.bookName="android开发";
book.bookId="1234";
book.bookPrice=78.9f;
ObjectOutputStream out = null;
try {
FileOutputStream fileStream = new FileOutputStream("E:\\Book.zs");
out=new ObjectOutputStream(fileStream);
out.writeObject(book);
out.flush();
} finally{
if(out!=null){
out.close();
}
}
反序列化读文件:
ObjectInputStream input=null;
try {
FileInputStream inputStream=new FileInputStream("E:\\Book.zs");
input=new ObjectInputStream(inputStream);
Book newBook=(Book)input.readObject();
if(newBook!=null){
System.out.println(newBook.bookName+" "+newBook.bookId+" "+newBook.bookPrice);
}
}finally{
if(input!=null){
input.close();
}
}
Parcelable
android提供的序列化接口,主要用于组件内或进程间通信,在内存中序列化,性能高于Serializable。
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator <MyParcelable> CREATOR
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
关注我的公众号.jpg
网友评论