序列化是什么

序列化是指把Java对象转换为字节序列并存储到一个存储媒介的过程。反之,把字节序列恢复为Java对象的过程则称之为反序列化。

为什么要序列化

序列化的主要作用是:

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

Android中序列化

在Android开发中,经常需要在多个部件(Activity、Fragment或Service)之间通过Intent传递一些数据,如果是一些普通类型的数据可以通过PutExtra()进行传递,如果是对象的话就得先进行序列化才能传递了。在Android中有两种序列化的接口,Serializable和Parcelable。

  • Serializable:(JavaSE本身就支持的)保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输。
  • Parcelable:(Android特有功能)因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效
    的传输数据而设计,这些数据仅在内存中存在。

何时使用它们

Parcelable的效率会比Serializable高,数据仅存在于内存中。而Serializable因为使用到了反射,会相对慢一些,因此,只在内存间传递数据的话推荐用Parcelable,而如果是要进行保存或者网络传输则选择Serializable。



最近在做用户注册的时候,遇到了需要填写很多表单数据,由于表单的数据,一般都是一个实体类,可以进行序列化的,序列化本身的目的是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。说白了,最终就是转换成了二进制数据,解决思路如下:

1.类对象

2.序列化

3.得到字符串数据

4.存储(android五种存储方式)

5.按照存储方式来获取数据

6.反序列化

7.得到相应的对象

代码:

Person.java

package com.example.shareddatatest;

import java.io.Serializable;

public class Person implements Serializable {

    private static final long serialVersionUID = 1L;
    String name;
    int age;
    String address;
    String education;
    String tel;

    public int getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getEducation() {
        return education;
    }

    public void setEducation(String education) {
        this.education = education;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

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

    String sex;

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address
                + ", education=" + education + ", tel=" + tel + ", sex=" + sex
                + "]";
    }


}



MainActivity.java


package com.example.shareddatatest;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {
    Person person = null;
    long startTime = 0l;
    long endTime = 0l;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        person = new Person();
        person.setName("LULU");
        person.setSex("bitch");
        person.setAddress("北京海淀");
        person.setAge(20);
        person.setTel("1231312");
        person.setEducation("小学");
    }

    /**
     * 序列化对象
     * 
     * @param person
     * @return
     * @throws IOException
     */
    private String serialize(Person person) throws IOException {
        startTime = System.currentTimeMillis();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(
                byteArrayOutputStream);
        objectOutputStream.writeObject(person);
        String serStr = byteArrayOutputStream.toString("ISO-8859-1");
        serStr = java.net.URLEncoder.encode(serStr, "UTF-8");
        objectOutputStream.close();
        byteArrayOutputStream.close();
        Log.d("serial", "serialize str =" + serStr);
        endTime = System.currentTimeMillis();
        Log.d("serial", "序列化耗时为:" + (endTime - startTime));
        return serStr;
    }

    /**
     * 反序列化对象
     * 
     * @param str
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    private Person deSerialization(String str) throws IOException,
            ClassNotFoundException {
        startTime = System.currentTimeMillis();
        String redStr = java.net.URLDecoder.decode(str, "UTF-8");
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
                redStr.getBytes("ISO-8859-1"));
        ObjectInputStream objectInputStream = new ObjectInputStream(
                byteArrayInputStream);
        Person person = (Person) objectInputStream.readObject();
        objectInputStream.close();
        byteArrayInputStream.close();
        endTime = System.currentTimeMillis();
        Log.d("serial", "反序列化耗时为:" + (endTime - startTime));
        return person;
    }

    void saveObject(String strObject) {
        SharedPreferences sp = getSharedPreferences("person", 0);
        Editor edit = sp.edit();
        edit.putString("person", strObject);
        edit.commit();
    }

    String getObject() {
        SharedPreferences sp = getSharedPreferences("person", 0);
        return sp.getString("person", null);
    }

    public void onclick(View v) {
        switch (v.getId()) {
        case R.id.button1:
            try {
                saveObject(serialize(person));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            break;
        case R.id.button2:
            try {
                Person person = deSerialization(getObject());
                Log.d("serial", person.toString());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            break;
        default:
            break;
        }
    }

}



logcat的结果为:


Android 保留Serializable序列化的类不被混淆存在漏洞 安卓数据序列化_android