一、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. 慢到不能忍?别忍了,Ubuntu 21.10 APT 源修改为华为云镜像源

    更新记录 2022年4月15日:本文迁移自Panda666原博客,原发布时间:2021年3月29日. 2022年4月15日:将源改为华为云,华为云更方便.Ubuntu从20.04更新到21.10. 切 ...

  2. flink 流的合并

    flink 流的合并操作 union union只能合并类型相同的数据,合并的结果仍然是DataStream,结果操作与未合并之前一致. public static void main(String[ ...

  3. Redis之Lua的应用(四)

    一.什么是Lua脚本 Lua是一个高效的轻量级脚本语言(和JavaScript类似),用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.Lu ...

  4. Citus 11 for Postgres 完全开源,可从任何节点查询(Citus 官方博客)

    Citus 11.0 来了! Citus 是一个 PostgreSQL 扩展,它为 PostgreSQL 添加了分布式数据库的超能力. 使用 Citus,您可以创建跨 PostgreSQL 节点集群透 ...

  5. 关于 GIN 的路由树

    GIN 是一个 golang 常用的 Web 框架,它对 API 比较友好,源码注释也很明确明确,使用起来快速灵活,还有极高的容错率.标题中的路由我们可以简单理解为在浏览器中输入的页面地址,而&quo ...

  6. Mysql事物锁等待超时(Lock wait timeout exceeded; try restarting transaction)

    一.问题描述 在做查询语句时,MySQL 抛出了这样的异常:锁等待超时 Lock wait timeout exceeded; try restarting transaction,是当前事务在等待其 ...

  7. 虚拟机使用docker 外部机器无法访问端口问题

    1,排查防火墙firewall-cmd --state 如果输出的是"not running"则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接 ...

  8. 《ASP.NET Core 6框架揭秘》样章发布[200页/5章]

    作为<ASP.NET Core 3 框架揭秘>的升级版,<ASP.NET Core 6框架揭秘>不仅针对ASP.NET Core 6的新特性进行了修订,并添加了若干原来没有的内 ...

  9. C# 11 的新特性和改进前瞻

    前言 .NET 7 的开发还剩下一个多月就要进入 RC,C# 11 的新特性和改进也即将敲定.在这个时间点上,不少新特性都已经实现完毕并合并入主分支 C# 11 包含的新特性和改进非常多,类型系统相比 ...

  10. Ubuntu 隐藏所有窗口快捷键不生效问题

    在绑定界面卡住时,切换到一个tty窗口,再切回来 gsettings reset-recursively org.gnome.settings-daemon.plugins.media-keys gs ...