一、Serializable序列化

Serializable是java提供的一种序列化方式,其使用方式非常简单,只需要实现Serializable接口就可以实现序列化.

public interface Serializable {

}

1.Serializable使用

import java.io.Serializable;

public class Person implements Serializable {
//如果不定义,系统会自动生成一个
//一般来说,我们需要手动指定,当反序列化时,如果类发生了改变,比如增加或删除了某些成员变量,系统重新计算serialVersionUID的值
//这个时候,保存在文件中的那个对象的serialVersionUID值和当前类的serialVersionUID值已经不一致了,会导致序列化失败
//如果你修改了类名,或者成员变量的数据类型,也是会序列化失败,因为结构已经发生了根本性的改变
private final static long serialVersionUID = 1L; //transient和static修饰的成员变量不会参与序列化
private transient int verson;
public String name;
public int age;
}
public static void main(String[] args){
Person person = new Person();
person.name = "miku";
person.age = 18; try {
//将对象保存到本地文件
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\person.obj"))) {
objectOutputStream.writeObject(person);
} //将保存到本地文件的对象反序列化,转换成可实际操作的对象
try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\person.obj"))) {
Person personWrite = (Person)objectInputStream.readObject(); System.out.println("===========反序列化=============");
System.out.println("name:" + personWrite.name);
System.out.println("age:" + personWrite.age);
}
} catch (Exception e) {
e.printStackTrace();
}
}

2.Serializable的优缺点

优点:

a.Serializable支持将对象保存到本地文件中,持久化保存

b.使用方便,应该是最方便的一种序列化方式了

缺点:

a.性能开销(cpu和磁盘读写)占用过高

b.安全性不强,用文本编辑器甚至能看到部分数据

二 、Externalizable序列化

Externalizable和Serializable区别其实不大,只是比Serializable多了自定义序列化的选择而已,因为Externalizable是继承自

Serializable接口多了一个读、写的方法而已.Externalizable可以自由选择哪些变量可以被序列化.

public interface Externalizable extends java.io.Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}

1.Externalizable的使用

public class User implements Externalizable{

    public String name;
public int age; @Override
public void writeExternal(ObjectOutput out) throws IOException {
//注意,写入的顺序和读取的顺序要一致,比如我先写入name,后写入age
//那么readExternal()读取的时候也要一致,不然会抛异常
out.writeObject("writeUser");
out.writeInt(18);
} @Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.name = (String)in.readObject();
this.age = in.readInt();
}
}
public static void main(String[] args) {
User user = new User();
user.name = "miku";
user.age = 16; System.out.println("==========序列化之前===========");
System.out.println("name: " + user.name);
System.out.println("age: " + user.age); try {
//将对象保存到文件
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\user.obj"))) {
objectOutputStream.writeObject(user);
} //将保存到文件的对象反序列化,还原成内存中的对象
try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\user.obj"))) {
User userWrite = (User)objectInputStream.readObject(); System.out.println("=============序列化之后==========");
System.out.println("name:" + userWrite.name);
System.out.println("age:" + userWrite.age);
} } catch (Exception e) {
e.printStackTrace();
}
}

2.Externalizable的优缺点

与Serializable一致,只不过比Serializable多了一个自定义序列化的过程,可人为控制

三、Parcelable序列化

Parcelable其实是安卓系统提供的一种内存数据传递的实现,严格来说并不能算是序列化,因为它只存在于

内存,无法持久化存储

官方文档介绍:

Parcelable

public interface Parcelable {

    public void writeToParcel(Parcel dest, @WriteFlags int flags);

    public interface Creator<T> {

        public T createFromParcel(Parcel source);
public T[] newArray(int size);
} public interface ClassLoaderCreator<T> extends Creator<T> {
public T createFromParcel(Parcel source, ClassLoader loader);
}
}

1.Parcelable的使用

public class Person implements Parcelable {
public String name;
public int age;
public int type;
public Object obj;
public Person user; public Person(){ } //出来实现接口提供的方法,还需要定义一个Parcel参数的构造函数CREATOR 调用
//读取的顺序要和写入的顺序一致,比如 type,name,age,那么writeToParcel()方法
//中的顺序也要一致
private Person(Parcel in) {
type = in.readInt();
name = in.readString();
age = in.readInt();
user = in.readParcelable(Thread.currentThread().getContextClassLoader());
} public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
} @Override
public Person[] newArray(int size) {
return new Person[size];
}
}; //默认返回0就可以了
//官方文档:https://developer.android.com/reference/android/os/Parcelable.html#CONTENTS_FILE_DESCRIPTOR
@Override
public int describeContents() {
return 0;
} //将数据写入到Parcel
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(type);
dest.writeString(name);
dest.writeInt(age);
dest.writeParcelable(user,0);
}
}
Person person = new Person();
person.name = "miku";
person.age = 16;
person.type = 1; //直接通过intent传递
Intent intent = new Intent(this,xxx.class);
intent.putExtra("user", person);
startActivity(intent);
xxxActivity.java

Person person = (Person) getIntent().getParcelableExtra("user")

2.Parcelable的优缺点

优点:

a.性能效率都比Serializable高.毕竟都是在内存中操作

b.因为数据都存在于内存,安全性要比Serializable

缺点:

a.Parcelable无法持久化存储,只能存在于内存

b.数据大小限制为几~KB,超过会抛 TransactionTooLargeException异常

Android序列化的几种实现方式的更多相关文章

  1. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览

    Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览   作为一个完成的应用程序,数据存储操作是必不可少的. ...

  2. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  3. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider

    ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...

  4. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...

  5. [Android]Android数据的四种存储方式

    存储方式 Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/d ...

  6. (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  7. [转][Android]Android数据的四种存储方式

    android.database.sqlite类 SQLiteQueryBuilder java.lang.Object android.database.sqlite.SQLiteQueryBuil ...

  8. Android数据的四种存储方式

    作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...

  9. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File

    作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别 是:SharePreference.SQLite.Content Provider和File ...

随机推荐

  1. ebook下载 | 灵雀云发布《 企业高管IT战略指南——为何选择容器与Kubernetes》

    发送关键词[高管指南]至灵雀云公众号,立即下载完整版电子书 "本书将提供企业领导者/IT高管应该了解的,所有关于容器技术和Kubernetes的基础认知和关键概念,突破技术语言屏障,全面梳理 ...

  2. Spring框架系列(2) - Spring简单例子引入Spring要点

    上文中我们简单介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework组件 ...

  3. vscode常用插件快捷键

    俗话说,工欲善其事必先利其器,我们码农的器是什么尼?没错,就是我们亲爱的IDE,前端开发者最爱的编辑器应该是vscode了吧.但是我们要怎么去锋利它尼?不外乎就是熟悉它的使用方法.快捷键以及第三方的插 ...

  4. 4种方法教你如何查看java对象所占内存大小

    摘要:本文讲述4种查看java对象所占内存大小的方法 本文分享自华为云社区<查看java对象所占内存大小>,作者:xiewenci. 计算java对象所占内存大小 1.使用jdk8自带AP ...

  5. Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b1938128a963

    报错信息:Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait ...

  6. shell 同时执行多任务下载视频

    本文为博主原创,转载请注明出处: shell 脚本不支持多线程,但我们需要用shell 脚本同时跑多个任务时怎么让这些任务并发同时进行,可以采用在每个任务 后面 添加一个  & ,让其在后台运 ...

  7. 2022省选前联考 AVL树/平衡树

    题目描述 pks 得到了一棵 \(N\) 个节点,权值为 \(1\sim N\) 的 \(AVL\) 树,他觉得这棵树太大了,于是他想要删掉一些节点使得最后剩下的树恰好有 \(K\) 个节点.如果 p ...

  8. java-Stream的总结

    JAVA中的Stream 01.什么是Stream Stream是JDK8中引入,Stream是一个来自数据源的元素序列并支持聚合操作.可以让你以一种声明的方式处理数据,Stream 使用一种类似用 ...

  9. Math类和函数定义

    Math这个类是java系统内部当中的一个类,他用来提供一些基本的数学操作,他也有些工具可以给我们用比如 :abs--算绝对值   pow--算幂次   random--随机数   round--四舍 ...

  10. Selenium指定浏览器路径

    ChromeOptions options = new ChromeOptions(); options.setBinary("C:\\Program Files (x86)\\Google ...