Android开发篇之对象序列化
来源:互联网 发布:mac mini 更新时间 编辑:程序博客网 时间:2024/05/16 02:38
Android开发篇之对象序列化
什么是序列化?序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。而Serializable和Parcelable接口就可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable。还有的时候我们需要把对象持久化到存储设备上或者通过网络传输给其他客户端,这个时候也需要使用Serializable来完成对象的持久化。
下面会分别来简单介绍一下Serializable和Parcelable接口的用法:
目录
- Android开发篇之对象序列化
- Serializable接口
- 实现序列化
- 对象序列化过程
- 对象反序列化过程
- Parcelable接口
- 实现序列化
- 对象序列化过程
- 对象反序列化过程
- Serializable与Parcelable的区别
- Serializable接口
Serializable接口
1. 实现序列化
public class User implements Serializable { private static final long serialVersionUID = 8711368828010083044L; private String Id; private String Name; public String getId() { return Id; } public void setId(String id) { Id = id; } public String getName() { return Name; } public void setName(String name) { Name = name; }}
(注:这里的serialVersionUID的值是手动指定,如果没有指定,则由编译器根据当前类的结构自动去生成它的hash值,这样序列化和反序列化时两者的serialVersionUID是相同的,因此可以正常进行反序列化。如果不手动指定serialVersionUID的值,反序列化时当前类有所改变,比如增加或者删除了某些成员变量,那么系统就会重新计算当前类的hash值并把它赋值给serialVersionUID,这个时候当前类的serialVersionUID就和序列化的数据中的serialVersionUID不一致,于是反序列化失败。)
2. 对象序列化过程
User user = new User();user.setId(editText1.getText().toString());user.setName(editText2.getText().toString());try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(CacheDir + "cache.txt")); out.writeObject(user); out.close();} catch (IOException e) { e.printStackTrace();}
3. 对象反序列化过程
try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(CacheDir + "cache.txt")); User user = (User)in.readObject(); editText1.setText(user.getId()); editText2.setText(user.getName()); in.close();} catch (IOException e) { e.printStackTrace();} catch (ClassNotFoundException e) { e.printStackTrace();}
Parcelable接口
1. 实现序列化
public class User implements Parcelable{ private String Id; private String Name; public User(){ Id = ""; Name = ""; } public String getId() { return Id; } public void setId(String id) { Id = id; } public String getName() { return Name; } public void setName(String name) { Name = name; } 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 out, int flags) { out.writeString(Id); out.writeString(Name); //out.writeInt(number); //out.writeInt(isBool?1:0); //out.writeParcelable(obejct,0); } protected User(Parcel in) { Id = in.readString(); Name = in.readString(); //isBool = in.readInt() == 1; //object = in.readParcelable(Thread.currentThread().getContextClassLoader()); }}
2. 对象序列化过程
User user = new User();user.setId(editText1.getText().toString());user.setName(editText2.getText().toString());Intent intent = new Intent(this,SecondActivity.class);Bundle bundle = new Bundle();bundle.putParcelable("user",user);intent.putExtras(bundle);startActivity(intent);
3. 对象反序列化过程
User user = (User) getIntent().getParcelableExtra("user");
Serializable与Parcelable的区别
Serializable是Java中的序列化接口,其使用起
来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。而Parcelable是Android中的序列化方式,因此更适用于Android平台上,它的缺点就是使用起来稍微麻烦点,但是它的效率很高,这是Android推荐的序列化方式,因此在用于Intent间的数据传递时我们要首选Parcelable。Parcelable主要用在内存序列化上,通过Parcelable将对象序列号和到存储设备中或者将对象序列化后通过网络传输也都是可以的,但是这个过程会稍微复杂,因此在这两种情况下建议大家使用Serializable。
主编 小牧
- Android开发篇之对象序列化
- Android笔记之对象序列化
- Android开发之序列化接口
- android对象序列化
- android 对象序列化
- android 对象序列化
- Android 对象序列化
- Android对象序列化
- android对象序列化
- Android对象序列化
- Android对象序列化
- Android对象序列化
- Android对象序列化
- android开发中对象的序列化-实现Parcelable接口.
- Android开发笔记(二十七)对象序列化
- Android 中对象实现序列化之Parcelable接口
- Android-Intent传递对象序列化之Serializable与Parcelable
- IOS 之对象序列化
- Struts2学习笔记
- 将二进制文件加入VC资源后释放执行
- 爬虫/脚本/Python语言- 脚本
- Hadoop name启动为standby状态shell命令报错
- Android 反编译工具使用
- Android开发篇之对象序列化
- 条件随机场(CRF) - 1 - 简介
- jsp/html简单的打印功能实现
- 从零开始接触jpa,工作中偶遇update问题
- Git仓库完整迁移方案
- 金蝶行政事业版V8.1多用户授权机
- Oracle的AWR报告分析
- RecyclerView.ItemAnimator终极解读(二)--SimpleItemAnimator和DefaultItemAnimator源码解析
- stdafx.h(38) : fatal error C1083: 无法打开包括文件:“afxcontrolbars.h”解决办法