Android Parcelable對象產生:ParcelableGenerator

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.