前言
在使用序列化的时候发现使用google推荐的Parcelable使用过于复杂,重复工作量太大。因此决定优化一下。
在经过一些构思与尝试之后,觉得使用反射来读写bean变量应该是可行的。于是开始行动。
1、首先创建通过反射读写bean的工具类
public static void writeParcelableBean(Parcelable classThis, Parcel dest, int flags){ try { //获取类的字节码文件对象 Class aClass = classThis.getClass(); //获取该类的所有成员变量 Field[] f = aClass.getDeclaredFields(); for(Field fie : f){ fie.setAccessible(true); switch (fie.getType().toString()){ case "int": dest.writeInt(Integer.parseInt(fie.get(classThis).toString())); break; case "class java.lang.String": dest.writeString(fie.get(classThis).toString()); break; } } } catch (Exception e) { e.printStackTrace(); } }
public static Parcelable readParcelableBean(Parcelable classThis, Parcel in){ try { Class aClass = classThis.getClass(); //获取该类的所有成员变量 Field[] f = aClass.getDeclaredFields(); for(Field fie : f){ fie.setAccessible(true); switch (fie.getType().toString()){ case "int": fie.set(classThis, in.readInt()); break; case "class java.lang.String": fie.set(classThis, in.readString()); break; } } } catch (Exception e) { e.printStackTrace(); } return classThis; }
2、然后创建bean类。
public class UserBean implements Parcelable { public UserBean(){} 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; } protected UserBean(Parcel in) { Utils.readParcelableBean(this, in); } public static final Creator<UserBean> CREATOR = new Creator<UserBean>() { @Override public UserBean createFromParcel(Parcel in) { return new UserBean(in); } @Override public UserBean[] newArray(int size) { return new UserBean[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { Utils.writeParcelableBean(this, dest, flags); } }
3、最后测试
UserBean userBean = new UserBean(); userBean.setAge(15); userBean.setName("I am zhangsan"); Intent intent = new Intent(this, TzyActivity.class); intent.putExtra(UserBean.class.getCanonicalName(), userBean); startActivity(intent);
userBean = intent.getParcelableExtra(UserBean.class.getCanonicalName());
4、完美通过,美中不足就是每一个bean都要去实现,没有达到使用一个父类去实现序列化,然后bean直接继承父类就ok,以后有时间继续研究。