android 进程间通信数据(一)------parcel的起源
关于parcel,我们先来讲讲它的“父辈” Serialize。
Serialize 是java提供的一套序列化机制。但是为什么要序列化,怎么序列化,序列化是怎么做到的,我们将在本文探讨下。
一:java 中的serialize
关于Serialize这个东东,think in java其实说的很详细,大意如下:
1.Serialize的目的
当你创建对象时,你需要,它一直存在,但是当程序终止时,它就消失了。
如果程序不运行的情况下,可以保存某些信息,这将非常有用。
如何我程序在下次运行的时候,可以把上次运行的某些信息恢复回来.
2.Serialize的使用:
使用一个嵌套的Serializable对象
package com.joyfulmath.androidstudy.bind.worm;
import java.io.Serializable;
public class Data implements Serializable {
private int n;
public Data(int n) {
this.n = n;
}
@Override
public String toString() {
return Integer.toString(n);
}
}
package com.joyfulmath.androidstudy.bind.worm; import java.io.Serializable;
import java.util.Random; import com.joyfulmath.androidstudy.TraceLog; public class Worm implements Serializable {
static Random rand = new Random(47);
Data[] d = {
new Data(rand.nextInt(10)),
new Data(rand.nextInt(10)),
new Data(rand.nextInt(10))
}; private Worm next;
private char c; public Worm(int i, char x)
{
TraceLog.i("Worm construct:"+i);
c = x;
if(--i>0)
{
next = new Worm(i,(char) (x+1));
}
} public Worm()
{
TraceLog.i("default Worm construct");
} @Override
public String toString() {
StringBuilder result = new StringBuilder(":");
result.append(c);
result.append("(");
for(Data dat:d)
{
result.append(dat+" ");
}
result.append(")");
if(next!=null)
{
result.append(next);
}
return result.toString();
} }
验证序列化的读写:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; import com.joyfulmath.androidstudy.TraceLog; public class WormSample { static final String path = "/mnt/sdcard/worm.out";
public void doAction()
{
Worm w = new Worm(6, 'a');
TraceLog.i("\n"+w.toString()); try {
ObjectOutputStream opt = new ObjectOutputStream(new FileOutputStream(path));
opt.writeObject("Worm object\n");
opt.writeObject(w);
opt.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));
String s = (String) in.readObject();
Worm w2 = (Worm) in.readObject();
TraceLog.i(s+w);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最后log:
08-15 09:18:20.384: I/Worm(28437): <init>: Worm construct:6 [at (Worm.java:21)]
08-15 09:18:20.384: I/Worm(28437): <init>: Worm construct:5 [at (Worm.java:21)]
08-15 09:18:20.384: I/Worm(28437): <init>: Worm construct:4 [at (Worm.java:21)]
08-15 09:18:20.384: I/Worm(28437): <init>: Worm construct:3 [at (Worm.java:21)]
08-15 09:18:20.384: I/Worm(28437): <init>: Worm construct:2 [at (Worm.java:21)]
08-15 09:18:20.384: I/Worm(28437): <init>: Worm construct:1 [at (Worm.java:21)]
08-15 09:18:20.384: I/WormSample(28437): doAction:
08-15 09:18:20.384: I/WormSample(28437): :a(853):b(119):c(802):d(788):e(199):f(881) [at (WormSample.java:18)]
08-15 09:18:20.414: I/WormSample(28437): doAction: Worm object
08-15 09:18:20.414: I/WormSample(28437): :a(853):b(119):c(802):d(788):e(199):f(881) [at (WormSample.java:28)]
可以看到,数据被很好的还原了,包含内部的序列化对象!
二:parcel
Serializable是java定义的一套序列化机制,但是他是操作文件来执行的。或者说,它的性能无法满足android上的要求,
这样,parcel被google发明出来,用以取代Serializable。
1.Parcelable 的使用
package com.joyfulmath.androidstudy.bind.worm; import android.os.Parcel;
import android.os.Parcelable; public class DataP implements Parcelable { public int n; public DataP(int n) {
this.n = n;
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(n);
} public static final Parcelable.Creator<DataP> CREATOR = new Parcelable.Creator<DataP>()
{
public DataP createFromParcel(Parcel in)
{
return new DataP(in);
} public DataP[] newArray(int size)
{
return new DataP[size];
}
}; private DataP(Parcel in)
{
n = in.readInt();
} @Override
public String toString() {
return Integer.toString(n);
} }
package com.joyfulmath.androidstudy.bind.worm; import java.util.Random; import com.joyfulmath.androidstudy.TraceLog; import android.os.Parcel;
import android.os.Parcelable; public class WormP implements Parcelable { static Random rand = new Random(47);
public DataP[] d = { new DataP(rand.nextInt(10)), new DataP(rand.nextInt(10)),
new DataP(rand.nextInt(10)) }; private WormP next;
public byte c; public WormP(int i,byte x)
{
TraceLog.i("Wormp construct:"+i);
c = x;
if(--i>0)
{
next = new WormP(i,(byte) (x+1));
}
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeByte(c);
dest.writeParcelableArray(d, 0);
if (next != null) {
dest.writeParcelable(next, 0);
}
} public static final Parcelable.Creator<WormP> CREATOR = new Parcelable.Creator<WormP>() {
public WormP createFromParcel(Parcel in) {
return new WormP(in);
} public WormP[] newArray(int size) {
return new WormP[size];
}
}; private WormP(Parcel in) {
c = in.readByte();
d = (DataP[]) in.readParcelableArray(DataP.class.getClassLoader());
} @Override
public String toString() {
StringBuilder result = new StringBuilder(":");
result.append(c);
result.append("(");
for(DataP dat:d)
{
result.append(dat+" ");
}
result.append(")");
if(next!=null)
{
result.append(next);
}
return result.toString();
}
}
parcel一般使用在intent的内容的传递,所以本处做一个简单的模拟:
public void doActionP()
{
TraceLog.i();
byte a = 'a';
WormP w = new WormP(6, a);
TraceLog.i(w.toString());
Intent intent = new Intent();
intent.putExtra("wormp", w);
///...
Intent newIntent = new Intent(intent);
WormP w2 = newIntent.getParcelableExtra("wormp");
TraceLog.i(w2.toString());
TraceLog.i("end");
}
08-15 10:14:11.924: I/WormSample(20183): doActionP: [at (WormSample.java:47)]
08-15 10:14:11.934: I/WormP(20183): <init>: Wormp construct:6 [at (WormP.java:21)]
08-15 10:14:11.934: I/WormP(20183): <init>: Wormp construct:5 [at (WormP.java:21)]
08-15 10:14:11.934: I/WormP(20183): <init>: Wormp construct:4 [at (WormP.java:21)]
08-15 10:14:11.934: I/WormP(20183): <init>: Wormp construct:3 [at (WormP.java:21)]
08-15 10:14:11.934: I/WormP(20183): <init>: Wormp construct:2 [at (WormP.java:21)]
08-15 10:14:11.934: I/WormP(20183): <init>: Wormp construct:1 [at (WormP.java:21)]
08-15 10:14:11.934: I/WormSample(20183): doActionP: :97(8 5 3 ):98(1 1 9 ):99(8 0 2 ):100(7 8 8 ):101(1 9 9 ):102(8 8 1 ) [at (WormSample.java:50)]
08-15 10:14:11.934: I/WormSample(20183): doActionP: :97(8 5 3 ):98(1 1 9 ):99(8 0 2 ):100(7 8 8 ):101(1 9 9 ):102(8 8 1 ) [at (WormSample.java:59)]
08-15 10:14:11.934: I/WormSample(20183): doActionP: end [at (WormSample.java:61)]
可以看到结果,数据完全正确。
以上就是parcel的使用方式,在下一篇,将探索parcel的实现方式。
参考:
http://blog.csdn.net/niu_gao/article/details/6451699
android 进程间通信数据(一)------parcel的起源的更多相关文章
- android 进程间通信数据(二)------parcel的实现
Serialize是java原生就自带的东西,我们可以看到android的源码 所以看看android是如何实现parcel的,这对我们自己代码设计有什么启发. Parcel: 在android中,p ...
- Android 进程间通信
什么鬼!单例居然失效了,一个地方设置值,另个地方居然取不到,这怎么可能?没道理啊!排查半天,发现这两就不在一个进程里,才恍然大悟-- 什么是进程 按照操作系统中的描述:进程一般指一个执行单元,在 PC ...
- Android进程间通信-AIDL实现原理
Android进程间通信基于Proxy(代理)与Stub(桩或存根)的设计模式(如图1-1所示).其中,Proxy将特殊性接口转换成通用性接口,Stub将通用性接口转换成特殊性接口,二者之间的数据转换 ...
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信 ...
- [转]Android进程间通信
Android进程间通信 一.Linux系统进程间通信有哪些方式? 1.socket: 2.name pipe命名管道: 3.message queue消息队列: 4.singal信号量: 5.sha ...
- Android 进程间通信——AIDL
代码地址如下:http://www.demodashi.com/demo/12321.html 原文地址:http://blog.csdn.net/vnanyesheshou/article/deta ...
- Android中数据存储(一)
国庆没有给国家添堵,没有勾搭妹子,乖乖的写着自己的博客..... 本文将为大家介绍Android中数据存储的五种方式,数据存储可是非常重要的知识哦. 一,文件存储数据 ①在ROM存储数据 关于在ROM ...
- Android本地数据存储复习
Android本地数据存储复习 Android无论是应用层还是系统层都需要在本地保存一些数据,尤其在应用层中使用的就更为普遍,大体有这么几种:SharedPreference,file,sqlite数 ...
- Android提交数据到JavaWeb服务器实现登录
之前学习Android提交数据到php服务器没有成功,在看了两三个星期的视频之后,现在终于实现了与服务器的交互.虽然完成的不是PHP端的,但是在这个过程还是学到了不少东西的.现在我先来展示一下我的成果 ...
随机推荐
- 基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出
数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform ...
- 参数类型params
params参数练习 namespace Test { class Program { static void Main(string[] args) { //params 构造函数声明数组,可变数组 ...
- 新浪微博.Net SDK第三版源代码和示例【最后一次更新了】
时间过得飞快,距离上次SDK更新已经3年有余.随着官方的不断跟新,老版SDK的部分接口已经不能正常使用.因此在QQ群里来吐槽的.来谩骂的朋友也开始多了起来.随着时代的发展,微博已经彻底的被微信甩开,因 ...
- VirtualBox网络设置的问题
在VirtualBox里新建了一个虚拟Linux系统,默认的连接方式是网络地址转换(NAT).发现主机不能访问虚拟机的samba服务器,ping了一下,虚拟机可以ping主机,但是主机不能ping虚拟 ...
- TabControl 显示彩色的图示 (XE6 Firemonkey)
提示:Delphi 10 Seattle 透过 TImageList 来指定图标,就能显示原来图标的颜色. 下列方法只适用于 XE6 XE6 Firemonkey 里的 TabControl 可以将切 ...
- Flume
http://www.ibm.com/developerworks/cn/data/library/bd-1404flumerevolution/index.html https://flume.ap ...
- 2016 年青岛网络赛---Tea
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5881 Problem Description Tea is good. Tea is life. Te ...
- swipe.js 2.0 轻量级框架实现mobile web 左右滑动
属性总结笔记如下: <style> .swipe { overflow: hidden; //隐藏溢出 清楚浮动 visibility: hidden; //规定元素不可见 (可以设置,当 ...
- Python Sqlite3以字典形式返回查询结果
sqlite3本身并没有像pymysql一样原生提供字典形式的游标. cursor = conn.cursor(pymysql.cursors.DictCursor) 但官方文档里已经有预留了相应的实 ...
- 移动端-js触摸事件
开发者工具 在移动开发中,一种较为容易的做法是,先在桌面上开始原型设计,然后再在打算要支持的设备上处理移动特有的部分.多点触摸正是难以在PC上进行测试的那些功能之一,因为大部分的PC都没有触摸输入. ...