栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android 序列化(Serializable和Parcelable)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 序列化(Serializable和Parcelable)

 什么是序列化

        由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘或者其他介质中,这个过程就叫做序列化。

 为什么序列化
  • 永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中)。

  • 对象在网络中传递。

  • 对象在IPC间传递。

 实现序列化的方式
  • 实现Serializable接口

  • 实现Parcelable接口

 Serializable 和 Parcelable 区别
  • Serializable 是Java本身就支持的接口。

  • Parcelable 是Android特有的接口,效率比实现Serializable接口高效(可用于Intent数据传递,也可以用于进程间通信(IPC))。

  • Serializable的实现,只需要implements Serializable即可。这只是给对象打了一个标记,系统会自动将其序列化。

  • Parcelabel的实现,不仅需要implements Parcelabel,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator接口。

  • Serializable 使用I/O读写存储在硬盘上,而Parcelable是直接在内存中读写。

  • Serializable会使用反射,序列化和反序列化过程需要大量I/O操作,Parcelable 自己实现封送和解封( marshalled &unmarshalled)操作不需要用反射,数据也存放在Native内存中,效率要快很多

 实现Serializable
import java.io.Serializable;

public class UserSerializable implements Serializable {
    public String name;
    public int age;
}

        然后你会发现没有serialVersionUID。

        Android Studio 是默认关闭 serialVersionUID 生成提示的,我们需要打开Setting,执行如下操作:

        再次回到UserSerializable类,有个提示,就可以添加serialVersionUID了。

 

        效果如下:

public class UserSerializable implements Serializable {
    private static final long serialVersionUID = 1522126340746830861L;
    public String name;
    public int age = 0;
    
}

 实现Parcelable

        Parcelabel的实现,不仅需要实现Parcelabel接口,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口,并实现读写的抽象方法。如下:

 public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator CREATOR
             = new Parcelable.Creator() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };

     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }

        此时Android Studio 给我们了一个插件可自动生成Parcelable 。

 自动生成 Parcelable
public class User {
    String name;
    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;
    }
}

想进行序列化,但是自己写太麻烦了,这里介绍个插件操作简单易上手。

 先下载

 

 使用

 

 

 

 效果
public class User implements Parcelable {
    String name;
    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;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.name);
        dest.writeInt(this.age);
    }

    public void readFromParcel(Parcel source) {
        this.name = source.readString();
        this.age = source.readInt();
    }

    public User() {
    }

    protected User(Parcel in) {
        this.name = in.readString();
        this.age = in.readInt();
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
}

        搞定。

        写完了咱就运行走一波。

 使用实例  Serializable
MainActivity.class
        Bundle bundle = new Bundle();
        UserSerializable userSerializable=new UserSerializable("SCC",15);
        bundle.putSerializable("user",userSerializable);
        Intent intent = new Intent(MainActivity.this, BunderActivity.class);
        intent.putExtra("user",bundle);
        startActivity(intent);
        
BunderActivity.class
        Bundle bundle = getIntent().getBundleExtra("user");
        UserSerializable userSerializable= (UserSerializable) bundle.getSerializable("user");
        MLog.e("Serializable:"+userSerializable.name+userSerializable.age);
        
日志:
2021-10-25 E/-SCC-: Serializable:SCC15
 Parcelable
MainActivity.class
        Bundle bundle = new Bundle();
        bundle.putParcelable("user",new UserParcelable("SCC",15));
        Intent intent = new Intent(MainActivity.this, BunderActivity.class);
        intent.putExtra("user",bundle);
        startActivity(intent);
        
BunderActivity.class
        Bundle bundle = getIntent().getBundleExtra("user");
        UserParcelable userParcelable= (UserParcelable) bundle.getParcelable("user");
        MLog.e("Parcelable:"+userParcelable.getName()+userParcelable.getAge());
        
日志:
2021-10-25 E/-SCC-: Parcelable:SCC15
 Parcelable 中使用泛型  UserParcelable
public class UserParcelable implements Parcelable {
    private String name;
    private int age;
    private T data;

    //...set/get部分省略

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public UserParcelable(String name, int age, T data) {
        this.name = name;
        this.age = age;
        this.data = data;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.name);
        dest.writeInt(this.age);
        //这里:先保存这个泛型的类名
        dest.writeString(data.getClass().getName());
        dest.writeParcelable(this.data, flags);
    }

    public void readFromParcel(Parcel source) {
        this.name = source.readString();
        this.age = source.readInt();
        //这里
        String dataName = source.readString();
        try {
            this.data = source.readParcelable(Class.forName(dataName).getClassLoader());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    protected UserParcelable(Parcel in) {
        this.name = in.readString();
        this.age = in.readInt();
        //这里
        String dataName = in.readString();
        try {
            this.data = in.readParcelable(Class.forName(dataName).getClassLoader());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static final Creator CREATOR = new Creator() {
        @Override
        public UserParcelable createFromParcel(Parcel source) {
            return new UserParcelable(source);
        }

        @Override
        public UserParcelable[] newArray(int size) {
            return new UserParcelable[size];
        }
    };
}
 Tman
public class Tman implements Parcelable {
    String color;

    public Tman(String color) {
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.color);
    }

    public void readFromParcel(Parcel source) {
        this.color = source.readString();
    }

    protected Tman(Parcel in) {
        this.color = in.readString();
    }

    public static final Creator CREATOR = new Creator() {
        @Override
        public Tman createFromParcel(Parcel source) {
            return new Tman(source);
        }

        @Override
        public Tman[] newArray(int size) {
            return new Tman[size];
        }
    };
}
 使用
MainActivity.class
        Bundle bundle = new Bundle();
        bundle.putParcelable("user",new UserParcelable<>("你好",2021,new Tman("红色")));
        Intent intent = new Intent(MainActivity.this, BunderActivity.class);
        intent.putExtra("user",bundle);
        startActivity(intent);
        
BunderActivity.class
        Bundle bundle = getIntent().getBundleExtra("user");
        UserParcelable userParcelable= (UserParcelable) bundle.getParcelable("user");
        MLog.e("Parcelable:"+userParcelable.getName()+userParcelable.getAge()+userParcelable.getData().getColor());
        
日志:
2021-10-25 E/-SCC-: Parcelable:你好2021红色

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号