实体类的序列化-Serializable和Parcelable

目录

什么是序列化

为什么需要序列化

序列化的方式

实例

Serializable的用法:

Parcelable的用法:

什么是序列化

数据的序列化是指,将我们程序开发的对象类,转化为计算机存储的最小单位,字节序列。

数据的反序列化是指:将计算机中的字节序列转换为我们开发中的对象实体类。

为什么需要序列化

         比如我们在Java程序开发过程中,声明一个Person对象,包括(姓名,身高,性别,职业)等属性,当我们程序执行,Person属性赋值时,这个对象是存在于内存当中的,而内存的数据在断电或者程序结束后,数据便会丢失,为了防止数据不丢失,我们可以通过序列化的方式存储在计算机外存当中,等下次需要的时候,再从外存取。而序列化的方式大大提高了数据传输的效率。也为数据的持久化存储提供了可能。

序列化的方式

Java:Serializable

Android:Parcelable,

1:重写writetoParcel(in:Parcel,flag:Int)和describeContents()方法

2:创建内部静态属性CREATOR,实现Parcelable.Creator<T>()接口,实现createFromParcel和newArray方法

ide一般会自己生成,需要我们结合业务补充属性。

防止安卓序列化失败,取不到值,要保证构造方法内的属性顺序及个数和writetoParcel的保持一致

原理:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致

区别:

Java的Serializabel接口,使用简单,但是效率较低,在使用过程中会产生大量的临时对象,引发GC。

Android的Parcelable接口,需要重写方法,更适合较为复杂的数据,效率较高,原理在于Parcelable接口会把对象分解为intent可以传递的数据类型。

实例

Serializable的用法:

实体类Student实现Serializable接口

data class Student(val name:String):Serializable{
    var height:Float = 0.0f
    var age:Int = 0
    var sex:Int = 0

    override fun toString(): String {
        return "Student(name='$name', height=$height, age=$age, sex=$sex)"
    }
}

 在A Activity中,可以通过intent的putExtra()传递

            val zs = Student("zhangsan")
            zs.height =152.5f 
            zs.age = 16
            zs.sex=1
            val intent = Intent(this,MainActivity2::class.java)
            intent.putExtra("data",zs)
            startActivity(intent)

 在B Activity中,通过getSerializableExtra()强转为对象  接收使用

        val zhangsan = intent.getSerializableExtra("student") as Student
        println("student name:${zhangsan.name}-age:${zhangsan.age}-height:${zhangsan.height}")

Parcelable的用法:

实体类Person

1:实现Parcelable接口,重写writeToPalcel(),describeContents()

2:实例化静态内部对象CREATOR,实现Parcelable.Creator<T>()接口

data class Person(val type:Int):Parcelable {

    var name = ""
    var age = 0


    constructor(parcel: Parcel) : this
        (type = parcel.readInt()) {
            //构造方法的变量及顺序应该和writeToParcel保持一致,不可不写
             name = parcel.readString().toString()
             age = parcel.readInt()
    }


    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(type)
        parcel.writeString(name)
        parcel.writeInt(age)
    }

    override fun describeContents(): Int {
        return 0
    }

    override fun toString(): String {
        return "Person(type=$type, name='$name', age=$age)"
    }

    companion object CREATOR : Parcelable.Creator<Person> {
        override fun createFromParcel(parcel: Parcel): Person {
            return Person(parcel)
        }

        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }
    }


}

在A Activity当中,通过bundle的putParcelable()传递实体类对象

    val zs = Person(1)
    zs.name = "zhangsan"
    zs.age = 16
    val intent = Intent(this,MainActivity2::class.java)
    val bundle = Bundle()
    bundle.putParcelable("person",zs)
    intent.putExtra("data",bundle)
    startActivity(intent)

在B Activity中,通过bundle的getParcelableExtra<T>()接收使用

  val data = intent.getBundleExtra("data")
        val person = data?.getParcelable<Person>("person")
        if (person != null)
            println("name:${person.name},age:${person.age}")

 Java-List集合以及数组类型的序列化:

public class bean implements Parcelable {

    private List<DataBean> data;
    private int errorCode;
    private String errorMsg;
//    private int[] numberArray;

    protected bean(Parcel in) {
        //List集合写法
        data = in.readArrayList(DataBean.class.getClassLoader());
        errorCode = in.readInt();
        errorMsg = in.readString();
        //int[]数组写法
//        numberArray = in.createIntArray();
    }

    public static final Creator<bean> CREATOR = new Creator<bean>() {
        @Override
        public bean createFromParcel(Parcel in) {
            return new bean(in);
        }

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

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public int getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(data);
        dest.writeInt(errorCode);
        dest.writeString(errorMsg);
//        dest.writeIntArray(numberArray);
    }

    public static class DataBean implements  Parcelable{
        private String desc;
        private int id;
        private String imagePath;
        private int isVisible;
        private int order;
        private String title;
        private int type;
        private String url;

        protected DataBean(Parcel in) {
            desc = in.readString();
            id = in.readInt();
            imagePath = in.readString();
            isVisible = in.readInt();
            order = in.readInt();
            title = in.readString();
            type = in.readInt();
            url = in.readString();
        }

        public static final Creator<DataBean> CREATOR = new Creator<DataBean>() {
            @Override
            public DataBean createFromParcel(Parcel in) {
                return new DataBean(in);
            }

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

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getImagePath() {
            return imagePath;
        }

        public void setImagePath(String imagePath) {
            this.imagePath = imagePath;
        }

        public int getIsVisible() {
            return isVisible;
        }

        public void setIsVisible(int isVisible) {
            this.isVisible = isVisible;
        }

        public int getOrder() {
            return order;
        }

        public void setOrder(int order) {
            this.order = order;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

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

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(desc);
            dest.writeInt(id);
            dest.writeString(imagePath);
            dest.writeInt(isVisible);
            dest.writeInt(order);
            dest.writeString(title);
            dest.writeInt(type);
            dest.writeString(url);
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java中的序列化是指将一个对象转换为字节序列的过程,以便于在网络上传输或者将对象保存到磁盘上。在Java中,只有实现了Serializable接口的对象才能被序列化,否则会抛出NotSerializableException异常。序列化可以通过ObjectOutputStream类来实现,反序列化可以通过ObjectInputStream类来实现。序列化在Java中广泛应用于分布式系统、缓存、消息队列等场景。 ### 回答2: Java序列化是指将对象转换为可存储或传输的字节序列的过程,可以使得对象的状态在程序结束后仍能够保存。使用Java的序列化机制能够方便实现Java对象的持久化,并且在数据传输过程中也可以进行对象的存储和传输,从而可以进行跨平台数据交互。 在Java中,如果一个类需要进行序列化,就需要实现Serializable接口。该接口是一个标记接口,不包含任何方法,只是用来表示这个类可以被序列化。当使用ObjectOutputStream来将某个对象转换成字节序列时,如果该对象所属的类实现了Serializable接口,那么该对象就可以被序列化,否则会抛出NotSerializableException异常。 序列化可以实现多种用途,例如: 1. 持久化:将对象序列化后储存在磁盘上,方便下次读取使用。 2. 分布式:在分布式系统中,对象在不同节点间传输时需要进行序列化和反序列化。 3. 缓存:将对象序列化后储存在缓存中,提高读取速度。 在序列化中也需要注意一些问题,例如: 1. 序列化ID:在序列化时,会对原对象进行哈希处理,生成一个序列化ID。反序列化时,会对这个ID进行比对,如果不一致就会抛出InvalidClassException异常。如果需要保持原有的序列化ID,可以通过声明静态变量serialVersionUID进行指定。 2. 敏感信息:在序列化时,需要注意敏感信息的处理,例如密码、证书等信息不应该被序列化。 3. 序列化版本:在序列化时,需要注意版本的处理。如果对象已经发生了变化,例如增删了某些属性或方法,就需要对版本做出相应的改变,否则会出现兼容性问题。 总之,Java的序列化机制为我们提供了一种方便、高效、跨平台的数据交互方式,使用起来相对简单,在实际开发中也非常实用。 ### 回答3: Java的序列化是指将一个对象转换成字节流的过程。当一个对象被序列化之后,它的字节流可以被传输到网络或者存储到本地磁盘上,以便于以后的操作。反序列化则是将字节流转换成对象的过程。 序列化在Java中的实现方式是通过实现Serializable接口来实现的。在Java中,Serializable接口是一个空接口,仅仅是一个标识接口,用来标记对象可以被序列化和反序列化。如果一个类实现了Serializable接口,那么就可以将该类的对象序列化和反序列化。 Java的序列化机制可以使用ObjectOutputStream类和ObjectInputStream类来实现。ObjectOutputStream类用于将对象序列化成字节流,而ObjectInputStream类用于将字节流反序列化成对象。 序列化的主要用途是将对象在网络中传输以及将对象存储到本地磁盘上。在网络中传输对象时,可以将对象序列化成字节流,然后在网络中传输。接收方可以将收到的字节流反序列化成对象,这样就可以在不同的机器上传递对象。在将对象存储到本地磁盘上时,可以将对象序列化成字节流,然后将字节流写入磁盘,以便以后可以读取该对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunbofiy23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值