文档章节

把你的对象给别人,你猜他会不会要?

磨砺营
 磨砺营
发布于 2016/09/11 13:20
字数 1102
阅读 25
收藏 0

【威哥说】在编程中我们经常要传递数据,而在Android开发中不可避免要传输对象数据,所以,就有了序列化,在java中序列化要使用Serializable,Android中虽然也可以使用Serializable,但是Google推荐我们使用Parcelable,那么这两个到底用哪个好?今天我们就来说说Android序列化那些事。

【正文】

一、首先序列化原因:

1.永久性保存对象,保存对象的字节序列到本地文件中;

2.通过序列化对象在网络中传递对象;

3.通过序列化在进程间传递对象。 

二、怎样实现序列化:

Android中实现序列化有两种方法:

1.将需要序列化的类实现Serializable接口就可以,JavaSE本身就支持。Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。

2.实现Parcelable接口,这是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC)。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。

这里还要注意的是Android中Intent传递对象有两种方法:一是Bundle.putSerializable(Key,Object),另一种是Bundle.putParcelable(Key,Object)。当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口。

三、下面看下Serializable实现与Parcelabel实现的区别

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

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

四、Serializable实现比较简单,实现接口就可以了。实现Parcelable步骤如下

1.implements Parcelable

2.重写writeToParcel方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从 Parcel容器获取数据

3.重写describeContents方法,内容接口描述,默认返回0就可以

4.实例化静态内部对象CREATOR实现接口Parcelable.Creator

 public static final Parcelable.Creator<T> CREATOR

注其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。需重写本接口中的两个方法:createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层,newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话即可(return new T[size]),供外部类反序列化本类数组使用。

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

实现Parcelable演示:

package com.moliying.parcelabledemo;

import android.os.Parcel; import android.os.Parcelable;

/**

  • 作者:dongcai on 2016/9/9 16:12

  • 邮箱:lidongcaiocc@163.com */ public class UserBean implements Parcelable{

    private String username; private int age; private String sex;

    public String getUsername() { return username; }

    public void setUsername(String username) { this.username = username; }

    public int getAge() { return age; }

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

    public String getSex() { return sex; }

    public void setSex(String sex) { this.sex = sex; }

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

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

    public static final Parcelable.Creator<UserBean> CREATOR = new Creator<UserBean>() { @Override public UserBean[] newArray(int size) { return new UserBean[size]; }

     @Override
     public UserBean createFromParcel(Parcel in)
     {
         return new UserBean(in);
     }
    

    };

    public UserBean(Parcel in) { username = in.readString(); sex = in.readString(); age = in.readInt(); } }

五、最后那我们到底应该用哪个项目,这里可以参照如下原则:

1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。

2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。

© 著作权归作者所有

磨砺营
粉丝 6
博文 80
码字总数 97977
作品 0
昌平
私信 提问
大领导绕过上司直接来谈工作,作为基层员工要如何应对?

你没有办法阻止大领导越级沟通,但是你可以和你的直接主管报备。 大领导交代了工作,在做之前,你应该主动找你的主管说下,他交代了什么,做还是不做。其实十之八九,可能要做……但是,至少...

明哥聊求职
2018/05/31
0
0
开发微信公众平台时需要注意的安全问题

申请公众平台开发者模式需要填写一个URL和一个Token, 见下图: 如果这个URL和Token被别人猜中了, 并且你不判断消息中的ToUserName属性是否跟你微信号相配, 那么别人的公众帐号申请开发者时填写...

panpanhtai
2014/06/28
309
3
无恙情感:当婚姻遭遇信任危机,99%的人不知道该这么做...

“亲爱的,外面没有别人,只有自己。” 这是张德芬在《遇见未知的自己》中所说的一句话。大致也是在告诉我们,其实不要把自己看得太重要,你只是你自己,而你所做的一切,别人可能真的不会去...

情感老师子溪
2019/07/05
0
0
币圈谋士:比特币11月惨淡收场,12月份的币圈只会更冷

11月份比特币的大幅度暴跌带动了整个主流币甚至整个市场加速下行,市场上可谓是哀鸿遍野,很多韭菜们再度被收割一茬,很多人还在说大熊市又来了。可是却不曾想今年整个市场本身就一直处于熊市...

币圈谋士
2018/12/01
0
0
放弃找IT学徒的想法,这事儿本身就不科学!

有过不少年轻人,找到我说要拜师学艺,希望获得单独指导,或者到我公司工作,不用给钱管吃住就行,就是为了学习…… 坦白讲,心情可以理解,但想法不现实。 拒绝之后,也不乏有人说“我可以给...

明哥聊求职
2018/07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 宇宙银河乱弹英雄传 —— @FalconChen

1Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :Axxis的单曲《Only God Knows》 最近只听摇滚,挖了好多以前没听过的歌,蛮好。#今日歌曲推荐# 《Only God Knows》- Axxis 手机...

小小编辑
今天
280
2
Safari Date() 函数对日期时间字符串(yyyy-MM-dd HH:mm:ss) 提示NaN的问题

今天发现一个奇怪的问题,在iPhone使用 safari 选择定时发布文章到OSC,选择时间后提示不是合法的时间,判断时间的代码如下: var d = new Date('2020-01-23 23:15'); if (isNaN(d)) {...

FalconChen
昨天
140
0
ActiveMQ学习之通讯协议

一、支持的通讯协议 ActiveMQ支持的client-broker通讯协议有:TCP、NIO、UDP、SSL、HTTP(S)、VM 其中配置Transport Connector的文件在ActiveMQ安装目录的conf/activemq.xml中的<TransportCon...

冥焱
昨天
91
0
应急广播户户通平台

一、平台概述 应急广播户户通平台为软硬一体化广播服务解决方案。实现了应急广播、视音频及图片文字信息、调频及数字广播FM、天气预报信息接收功能,以及视音频播放、智能机器人、电子日历等...

neocean
昨天
133
0
如何为Apache 2.2启用mod_rewrite

我已经在我的Vista机器上安装了新的Apache 2.2,一切正常,除了mod重写。 我没有注释 LoadModule rewrite_module modules/mod_rewrite.s 但是我的重写规则都没有,即使是简单的重写规则 Re...

javail
昨天
53
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部