標籤:android parcelable 序列化
github 地址: https://github.com/baoyongzhang/ParcelableGenerator
分析:
該項目是使用了Annotation的編譯期註解,即@Retention(RetentionPolicy.CLASS)
同時未使用@Inherited註解,所以在需要序列化的 不管父類還是子類上 都要加上@Parcelable
如下引用readme.md
ParcelableGenerator介紹
ParcelableGenerator可以將任意對象轉換為Parcelable類型,方便對象傳輸。
在Android中,對象的序列化一般有兩種方式,一種是Serializable,一種是Parcelable。
- Serializable 在Java中就存在,效率較低。
- Parcelable 是Android中提供的,也是官方推薦的方式,效率比Serializable高很多。
雖然Parcelable效率高,但是使用起來比Serializable麻煩很多,很多人不使用Parcelable就是因為寫法太麻煩,尤其是屬性特別多的時候,我們要將每個屬性Parcel.write()然後在Parcel.read()回來,相當繁瑣,不如Serializable簡單粗暴,直接有效。
ParcelableGenerator可以解決Parcelable使用麻煩的問題,讓使用Parcelable的簡單性可以和使用Serializable相媲美。
使用方法
例如我們有一個User類,用來儲存使用者的一些資訊,我們需要使用@Parcelable修飾該類,注意@Parcelable修飾的類必須有公有無參構造方法。
import com.baoyz.pg.Parcelable;@Parcelablepublic class User { 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; }}
我們要將一個User對象通過Intent傳遞給一個Activity叫做ShowUserActivity。我們需要調用Intent.putExtra()方法將對象傳入,這時候直接傳遞肯定是不行的,我們需要調用PG.createParcelable()方法將對象轉換為Parcelable在傳入Intent中。
import com.baoyz.pg.PG;// 類比建立對象,並設定屬性值 User user = new User();user.setName("zhangsan");user.setAge(18);Intent intent = new Intent(this, ShowUserActivity.class);// 調用PG將對象轉換成Parcelable,傳入Intent中intent.putExtra("user", PG.convertParcelable(user));startActivity(intent);
在ShowUserActivity中擷取User對象,無需寫任何轉換的代碼,直接getIntent().getParcelableExtra()賦值給原物件類型變數即可。
public class ShowUserActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 直接擷取原物件類型 User user = getIntent().getParcelableExtra("user"); // 擷取屬性值 user.getName(); user.getAge(); }}
//上面可能會報錯,可以使用如下兩種方法
User user = PG.unconvert(intent.getParcelableExtra("user"));
// User user = (User) intent.getParcelableExtra("user");
更新介紹Version 2.0
- 修複BUG,使用基礎資料型別 (Elementary Data Type)封裝類會出現問題等。
- 增加 @ParcelIgnore 註解,修飾在Model的Field上面,可以忽略該欄位不進行序列化。
- 使用更加方便,當Model中的屬性是其他對象,或者List中包含其他對象,該對象的類用 @Parcelable 聲明之後無需加轉碼。
// 當傳遞對象的屬性包含其他對象,或者是List,而該對象或List中的對象不支援序列化,那麼直接傳遞將會出現null// 解決辦法,將不支援序列化的類用@Parcelable修飾// 例如一個教室對象Classroom room = new Classroom();// 教室中包含一個老師,Teacher類用@Parcelable修飾Teacher teacher = new Teacher("teacherName");// 將老師對象直接賦值給教室room.setTeacher(teacher);// 再例如,教室中包含很多學生,使用List儲存,Student類用@Parcelable修飾List<Student> students = new ArrayList<Student>();// 直接建立Student對象添加到List中students.add(new Student("stu1"));students.add(new Student("stu2"));students.add(new Student("stu3"));room.setStudents(students);// 傳遞教室對象,調用轉換方法,此時內部會自動將Teacher、和List中的Student對象轉為Parcelable類型並傳遞intent.putExtra("classroom", PG.convertParcelable(room));
Android Parcelable對象產生:ParcelableGenerator