发布于2022年11月4日3年前 序列化 1.Serializable Java序列化就是指把Java对象转换为字节序列的过程 Java反序列化就是指把字节序列恢复为Java对象的过程。 实现序列化和反序列化的三种实现: ①若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化。 ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。 ObjcetInputStream采用默认的反序列化方式,对Student对象的非transient的实例变量进行反序列化。 ②若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。 ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。 ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。 ③若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。 ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。 ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。 //序列化实例 public class SerializableTest { public static void main(String[] args) throws IOException, ClassNotFoundException { //序列化 FileOutputStream fos = new FileOutputStream("object.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); Student student1 = new Student("lihao", "wjwlh", "21"); oos.writeObject(student1); oos.flush(); oos.close(); //反序列化 FileInputStream fis = new FileInputStream("object.out"); ObjectInputStream ois = new ObjectInputStream(fis); Student student2 = (Student) ois.readObject(); System.out.println(student2.getUserName()+ " " + student2.getPassword() + " " + student2.getYear()); } } //对象 public class Student implements Serializable{ private static final long serialVersionUID = -6060343040263809614L; private String userName; private String password; private String year; public String getUserName() { return userName; } public String getPassword() { return password; } public void setUserName(String userName) { this.userName = userName; } public void setPassword(String password) { this.password = password; } public String getYear() { return year; } public void setYear(String year) { this.year = year; } public Student(String userName, String password, String year) { this.userName = userName; this.password = password; this.year = year; } } 2.Parcelable public class NewClient implements Parcelable { public int id; public String name; public User user; /** * 当前对象的内容描述,一般返回0即可 * @return */ @Override public int describeContents() { return 0; } /** * 将当前对象写入序列化结构中 * @param dest * @param flags */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.id); dest.writeString(this.name); dest.writeParcelable(this.user,0); } public NewClient() { } /** * 从序列化后的对象中创建原始对象 * @param in */ protected NewClient(Parcel in) { this.id = in.readInt(); this.name = in.readString(); //User是另一个序列化对象,此方法序列需要传递当前线程的上下文类加载器,否则会报无法找到类的错误 this.user=in.readParcelable(Thread.currentThread().getContextClassLoader()); } /** * public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。 * 重写接口中的两个方法: * createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层, * newArray(int size) 创建一个类型为T,长度为size的数组,供外部类反序列化本类数组使用。 */ public static final Parcelable.Creator<NewClient> CREATOR = new Parcelable.Creator<NewClient>() { /** * 从序列化后的对象中创建原始对象 */ @Override public NewClient createFromParcel(Parcel source) { return new NewClient(source); } /** * 创建指定长度的原始对象数组 * @param size * @return */ @Override public NewClient[] newArray(int size) { return new NewClient[size]; } }; } 3.XML JSON //序列化 Gson gson=new Gson(); gson.toJson(对象); //反序列化 Type type=new TypeToken<对象类型>>(){}.getType(); gson.fromJson(对象的json数据,type);
创建帐户或登录后发表意见