对象序列化

一.为啥需要它?

对象进行网络传输、持久化存储、跨进程传输等必须进行序列化,也就是将对象流化。否则不能进行上述操作。

二.怎样使用它?

  • Serializable示例

 public class Person implements Serializable{

private static final long serialVersionUID = 7382351359868556980L; //这个用于反序列化时判断是否是同一对象

private String name;

private int age;

public int getAge() { return age; }

public void setAge(int age) { this.age = age; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }

}

  • Parcelable示例

public class User implements Parcelable {

    public String name;
    public int id;
    public Book book;
    
    public User(String name, int id, Book book) {
        this.name = name;
        this.id = id;
        this.book = book;
    }

    protected User(Parcel in) {
        name = in.readString();
        id = in.readInt();
        book= in.readParcelable(getClass().getClassLoader());

     //反序列化类时需要传递当前线程的上下文类加载器
    }
    //主要用于反序列化对象
    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);//从序列化后的对象中创建原始对象
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];//创建指定长度的原始对象数组
        }
    };

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {

//flags标识有两种值:0或者1,为1时标识当前对象需要作为返回值返回,不能立即释放资源,

//几乎所有情况都为0
        dest.writeString(name);
        dest.writeInt(id);
        dest.writeParcelable(book,flags);
    }
}

三.它的原理是什么?

 序列化算法一般会按步骤做如下事情:

(1)将对象实例相关的类元数据输出。 
(2)递归地输出类的超类描述直到不再有超类。 
(3)类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。 
(4)从上至下递归输出实例的数据

四.附加知识有哪些?

Serializable注意事项

  • 对象的属性会进行序列化,方法不会进行序列化。
  • 序列化的对象进行反序列化时,如果两个类的属性不一致时,序列化对象的属性在反序列化对象中都有对应,则可以进行反序列化,否则,反序列会报错。
  • 进行序列化的类和反序列的类的包名和类名都需要一样。

Parcelable注意事项

  • Parcelable序列化写操作是通过writeToParcel(Parcel dest, int flags)实现
  • Parcelable默认要实现反序列对象CREATOR ,系统会自动调用CREATOR对象中的方法。

Serializable和Parcelable对比。

编码上:

Serializable代码量少,写起来方便

Parcelable代码多一些

效率上:

Parcelable的速度比Serializable 高十倍以上

serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。

这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。

Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值