Serializable接口
Java提供的一个序列化空接口,为对象提供标准的序列化和反序列化操作,使用方法只需要在类的声明中指定一个标识
public class User implements Serializable {
private static final long serialVersionUID = 519067123721295773L;
public int userId;
public String userName;
public boolean isMals;
......
}
序列化过程
实现序列化和反序列化的方式非常简单,只需要使用ObjectOutputString和ObjectInputString即可实现
//序列化
User user = new User (0, "jace", true);
ObjectOutputString out = new ObjectOutputString( new FileOutputString ("cache.txt") );
out.writeObject(user);
out.close();
//反序列化
ObjectInputString in = new ObjectInputString( new FileInputString("catche.txt") );
User newUser = (User) in.readObject();
in.closer();
注意:恢复后的对象newUser和user的内容完全一样,但是两者并不是同一个对象
手动设置serialVersionUID
关于手动设置serialVersionUID,是因为省去的当原类发生变化时(如增加或删除了某些成员变量,系统会重新去计算当前类的hash值并把它赋值给新的serialVersionUID,导致跟之前的不一致,进而出现反序列化失败的场景),但如果类结构发生了非常规性改变(修改类名、修改成员变量的类型)即使此时指定的serialVersionUID,还是会反序列化失败,因为类结构发生了根本性的改变,无法从老版本的数据中还原
serialVersionUID出错
注意:静态成员变量属于类不属于对象;使用transient关键字修饰的成员变量不参与序列化过程
Parcelable接口
实现Parcelable接口,类对象可以实现序列化并通过Intent和Binder传递
用法
public class User implements Parcelable {
public int userId;
public String userName;
public boolean isMale;
public Book book;
public User( int userId, String userName, boolean isMale) {
this.userId = userId;
this.userName = userName;
this.isMale = isMale;
}
public int dercribeContents() {
return 0;
}
public void writeToParcel(Parcel out,int flags) {
out.writeInt(userId);
out.writeString(userName);
out.writeInt(isMale ? 1 : 0);
out.writeParcelable(book,0);
}
public static final Parcelable.Creator<User> CREATOR = new Parcelable.
Creator<User>() {
public User createFromParcel(Parcel in) {
return new User(in);
}
public User[] newArray(int size) {
return new User[size];
}
};
private User(Parcel in) {
userId = in.readInt();
userName = in.readString();
isMale = in.readInt() == 1;
book = in.readParcelable(Thread.currentThread().getContextClassLoader());
}
}
Parcel内部包装了序列化的数据,可以在Binder中自由传输,序列化由writeToParcel完成,反序列化由CREATOR完成,内容描述由describeCotents方法完成
Parcel常用方法
系统中提供了很多实现Parcel接口的类,用于直接完成序列化,如Intent、Bundle、Bitmap等,同时List和Map也可以序列化,前提是它里面的每个元素都是可以序列化的
Serializable和Parcel的比较
标签:Serialzable,userId,接口,User,new,序列化,public,out From: https://blog.csdn.net/qq_53092981/article/details/144053216二者都可以进行序列化并且可用于Intent间数据传递
Serializable是Java中序列化的接口,使用简单,但开销较大,序列化和反序列化的过程中需要大量的I/O操作
Parcelable是Android中的序列化方式,更适合在Android平台上使用,使用起来相对较为繁琐,但效率高。