Android序列化

序列化介绍:

一、序列化、反序列化是什么?

(1) 名词解释

对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。
对象的反序列化:把字节序列恢复为Java对象的过程。

(2) 序列化详细解释

对象的序列化涉及三个点关键点:Java对象、字节序列、存储。

1. Java对象的组成?
Java对象包含变量与方法。但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理。

2. 什么是字符序列?
字符序列是两个词,字符是在计算机和电信领域中,字符(Character)是一个信息单位。数学上,序列是被排成一列的对象(或事件)。
《字符-维基百科》 , 《序列-维基百科》 说白了就是连续排列的多个字符的集合。类似于1A165613246546

3. 存储
字符序列需要保存到一个地方,可以是硬盘也可以是内存。
简单说法是:序列化把当前对象信息保存下来。反序列化刚好相反的操作。

二、Java对象与Java对象序列化的区别?

Java对象存在的前提必须在JVM运行期间存在,如果想在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象,在现有Java对象的机制下都不可能完成。
与Java对象不同的是,如果对Java对象执行序列化操作,因为原理是把Java对象信息保存到存储媒介,所以可以在以上Java对象不可能存在的两种情况下依然可以使用Java对象。

三、为什么要使用序列化、反序列化?

根据以上对序列化、反序列化的理解,这个疑问可以翻译成,为什么需要把对象信息保存到存储媒介中并之后读取出来?
因为二中的解释,开发中有在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象的需求。

Android序列化-- Parcelable和Serializable

序列化用处:

1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程或activity间传递对象。

android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。

介绍:

Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。

而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

效率:

1.Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用     Serializable

4.Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

实现Parcelable接口的方法

通过实现Parcelable接口序列化对象的步骤:

1、实现Parcelable接口。

2、并且实现Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法 。

3、自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法。

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

代码示例:

 1 package parcelable_test.com;
 2 import android.os.Parcel;
 3 import android.os.Parcelable;
 4 import android.util.Log;
 5 public class Person implements Parcelable{
 6 private String name;
 7 private int age;
 8 private static final String TAG = ParcelableTest.TAG;
 9 public String getName() {
10 return name;
11 }
12 public void setName(String name) {
13 this.name = name;
14 }
15 public int getAge() {
16 return age;
17 }
18 public void setAge(int age) {
19 this.age = age;
20 }
21 public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {
22 @Override
23 public Person createFromParcel(Parcel source) {
24 Log.d(TAG,"createFromParcel");
25 Person mPerson = new Person();
26 mPerson.name = source.readString();
27 mPerson.age = source.readInt();
28 return mPerson;
29 }
30 @Override
31 public Person[] newArray(int size) {
32 // TODO Auto-generated method stub
33 return new Person[size];
34 }
35 };
36 @Override
37 public int describeContents() {
38 // TODO Auto-generated method stub
39 Log.d(TAG,"describeContents");
40 return 0;
41 }
42 @Override
43 public void writeToParcel(Parcel dest, int flags) {
44 // TODO Auto-generated method stub
45 Log.d(TAG,"writeToParcel");
46 dest.writeString(name);
47 dest.writeInt(age);
48 }
49 }

通过Parcelable接口传递一些数据:

 1 //仅贴出代表性代码
 2 private void fun(){
 3 Log.d(TAG, "fun");
 4 Person mPerson = new Person();
 5 mPerson.setName("tom");
 6 mPerson.setAge(25);
 7 //activity跳转
 8 Intent mIntent = new Intent(this,parcelable_test.com.ParcelableTest2.class);
 9 Bundle mBundle = new Bundle();
10 mBundle.putParcelable(KEY, mPerson);
11 mIntent.putExtras(mBundle);
12 startActivity(mIntent);
13 }  

ParcelableTest2.java,这个类用于获取ParcelableTest传出的数据,并显示在UI上:

 1 package parcelable_test.com;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.util.Log;
 6 import android.widget.TextView;
 7
 8 public class ParcelableTest2 extends Activity{
 9 private static final String TAG = ParcelableTest.TAG;
10 @Override
11 public void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.main);
14         Log.d(TAG, "ParcelableTest2");
15         TextView textView = new TextView(this);
16         Person mPerson = (Person)getIntent().getParcelableExtra(ParcelableTest.KEY);
17         textView.setText("name = " + mPerson.getName() + "  age = " + mPerson.getAge());
18         setContentView(textView);
19     }
20 }

部分来自:http://www.2cto.com/kf/201403/288476.html,http://blog.csdn.net/zyc13701469860/article/details/6429934,谢谢作者

时间: 2024-10-06 11:45:59

Android序列化的相关文章

Android 序列化对象接口Parcelable使用方法

什么是Parcelable ? Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口.一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为"可打包的"了. Parcelable 传递对象 Android序列化对象主要有两种方法: 1.实现Serializable接口,实现Serializable接口是JavaSE本身就支持的; 2.实现Parcelable接口,Parcelable是Android特有的功能,效率比

Android开发之漫漫长途 X——Android序列化

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解Android 卷Ⅰ,Ⅱ,Ⅲ>中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是Android中高级开发工程师. 前言 上一篇中我们比较详尽的分析了ServiceManag

Android 序列化比对

本文转自:https://www.zybuluo.com/linux1s1s/note/91046 注:部分内容有更改 在Android中使用序列化,无非两种途经: Parcelable 和 Serializable 两者区别 Serializable的作用是为了保存对象的属性到本地文件.数据库.网络流.rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的. Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(

Android 序列化 反序列功能

1 /** 2 * 序列化对象 3 * 4 * @return 序列化后的字符串 5 */ 6 private String serializeObject(Object object) { 7 ByteArrayOutputStream byteArrayOutputStream=null; 8 ObjectOutputStream objectOutputStream=null; 9 String serStr=""; 10 try{ 11 byteArrayOutputStrea

android 序列化

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

(转)Android 序列化对象接口Parcelable使用方法

http://blog.csdn.net/zpf8861/article/details/39400725

Android Parcelable接口的使用/序列化数据

首先,我们要知道Android序列化的方法有两种,一个是实现Serializable,这是JavaSE中就支持的接口,后来google推出了专门针对Android的接口Parcelable(其性能相对Serializable将近快了10倍) 然后我们要知道Android内部传递实例的基本方法:一是Bundle.putSerializable(Key,Object),另一种是Bundle.putParcelable(Key,Object),它们分别要实现Serializable和Parcelabl

android对象序列化Parcelable浅析

一.android序列化简介 我们已经知道在Android使用Intent/Bindler进行IPC传输数据时,需要将对象进行序列化. JAVA原本已经提供了Serializable接口来实现序列化,使用起来非常简单,主要用于对象持久化以及对象的网络传输.Serializable开销比较大,因为序列化和反序列化的过程需要大量的I/O操作. Android提供了Parcelable对象序列化操作是内存序列化,主要用于Intent/Bindler的IPC数据传输. 二.Parcelable序列化使用

android 混淆 与 反编译

1, 文件 project.properties 修改: target=android-14proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 必须这个顺序. 2,proguard-project.txt 注意排除使用反射的源码. # To enable ProGuard in your project, edit project.properties# to define the