1. 什么是java序列化,如何实现java序列化?

我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,JRE本身就提供了这种支持,我们可以调用OutputStream的writeObject()方法来做,如果要让java 帮我们做,要被传输的对象必须实现Serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject()方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的

例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口

2. Serializable

Serializable是一个javase标记接口,会产生一个序列化值,该值跟bean的成员相关,所以实现Serilizable接口的时候,必须给一个uid,否则,当成员变化的时候,标记值也会变化,再次读取的时候也出现exception(要先重新write再read,但是write可能会让之前的数据丢失)

注意事项

  • 使用transient关键字声明不需要序列化的成员变量
  • 序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?
private static final long serialVersionUID = -2071565876962058344L;

3. Parcelable

因为Serializable接口在序列化的时候会产生大量的临时变量,效率较低,而Parcelable是android推出的高效序列化接口

public final class Rect implements Parcelable {public int left;public int top;public int right;public int bottom;public static final Parcelable.Creator<Rect> CREATOR = newParcelable.Creator<Rect>() {public Rect createFromParcel(Parcel in) {return new Rect(in);}public Rect[] newArray(int size) {return new Rect[size];}};public Rect() {}private Rect(Parcel in) {readFromParcel(in);}public void writeToParcel(Parcel out) {out.writeInt(left);out.writeInt(top);out.writeInt(right);out.writeInt(bottom);}public void readFromParcel(Parcel in) {left = in.readInt();top = in.readInt();right = in.readInt();bottom = in.readInt();}
}

Android Parcelable code generator

生成Parcelable代码

4. Serialiable与Parcelable的区别

  • 在使用内存的时候,Parcelable 类比Serializable 性能高,首选使用Parcelable 类
  • Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的GC
  • 数据持久化,Parcelable 不能使用在要将数据存储在磁盘上的情况。尽管Serializable 效率低点,但在这种情况下,还是建议你用Serializable

Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。而Parcelable是Android中的序列化方式,因此,更适合用在Android平台上,它的缺点就是用起来稍微麻烦点,但是它的效率很高,这是Android推荐的序列化方式,因此,我们要首选Parcelable。Parcelable主要用在内存序列化上,通过Parcelable将对象序列化到存储设备中或者将对象序列化后通过网络传输也都是可以的,但是这个过程会稍显复杂,因此在这两种情况下建议大家使用Parcelable。

5. 序列化流ObjectOutputStream

ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

只能将支持 java.io.Serializable 接口的对象写入流中。每个 Serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

writeObject() 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject ()写入。可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。

还可以使用 DataOutput 中的适当方法将基本数据类型写入流中。还可以使用 writeUTF() 方法写入字符串。

对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。其他对象的引用(瞬态和静态字段除外)也会导致写入那些对象。可使用引用共享机制对单个对象的多个引用进行编码,这样即可将对象的图形恢复为最初写入它们时的形状。

构造方法

  • ObjectOutputStream()
    为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。

  • ObjectOutputStream(OutputStream out) :
    创建写入指定 OutputStream 的 ObjectOutputStream

6. 反序列化流ObjectInputStream

1、ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

2、ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。

3、ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。

4、只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。

5、readObject 方法用于从流读取对象。应该使用 Java 的安全强制转换来获取所需的类型。在 Java 中,字符串和数组都是对象,所以在序列化期间将其视为对象。读取时,需要将其强制转换为期望的类型。

6、可以使用 DataInput 上的适当方法从流读取基本数据类型。

7、默认情况下,对象的反序列化机制会将每个字段的内容恢复为写入时它所具有的值和类型。反序列化进程将忽略声明为瞬态或静态的字段。对其他对象的引用使得根据需要从流中读取这些对象。使用引用共享机制能够正确地恢复对象的图形。反序列化时始终分配新对象,这样可以避免现有对象被重写。

8、序列化操作问题:NotSerializableException:未序列化异常

9、为什么要实现序列化?如何实现序列化?

类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口。

10、序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?

每次修改java文件的内容的时候,class文件的id值都会发生改变。而读取文件的时候,会和class文件中的id值进行匹配。所以,就会出问题。让这个id值在java文件中是一个固定的值,这样,你修改文件的时候,这个id值就不会发生改变。

我们要知道的是:看到类实现了序列化接口的时候,要想解决黄色警告线问题,就可以自动产生一个序列化id值。而且产生这个值以后,我们对类进行任何改动,它读取以前的数据是没有问题的。

11、我一个类中可能有很多的成员变量,有些我不想进行序列化。请问该怎么办呢?

使用transient关键字声明不需要序列化的成员变量
代码示例:

package cn.itcast_07;  import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;  /* * 序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream) * 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream) */
public class ObjectStreamDemo {  public static void main(String[] args) throws IOException,  ClassNotFoundException {  // 由于我们要对对象进行序列化,所以我们先自定义一个类  // 序列化数据其实就是把对象写到文本文件  // write();  read();  }  private static void read() throws IOException, ClassNotFoundException {  // 创建反序列化对象  ObjectInputStream ois = new ObjectInputStream(new FileInputStream(  "oos.txt"));  // 还原对象  Object obj = ois.readObject();  // 释放资源  ois.close();  // 输出对象  System.out.println(obj);  }  private static void write() throws IOException {  // 创建序列化流对象  ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(  "oos.txt"));  // 创建对象  Person p = new Person("林青霞", 27);  // public final void writeObject(Object obj)  oos.writeObject(p);  // 释放资源  oos.close();  }
}  

7. Parcelable 接口和Serializable 接口的区别?

Parcelable 接口是基于Android 源生的提供的序列化接口,Serializable 接口是基于Java 源生提供的序列化接口。都可以将数据持久化到本地。但是在开发中经常使用Serializable 接口,因为Parcelable接口需要实现两个方法,writeToParcel 和readFromParcel,比较麻烦。但是Android 源码中会常用Parcelable接口,因为Parcelable 接口更轻量级一些,更符合Android 的特性。

Intent 也实现了Parcelable 接口。所以它可以将数据进行序列化和反序列化,并且可以开启页面,通过putExtra 将数据来回传递。

public class Intent implements Parcelable, Cloneable {// 省略代码
}

比如Person 大家都比较了解,Person 是对数据的封装,它可以有name,age,sex 属性,当我们需要通过intent 来传递Person 对象的时候,需要让Person 实现Parcelable 接口,通过putExtra(String name,Parcelable value)方法来传递。

Android序列化:Serializable & Parcelable

http://blog.csdn.net/axi295309066/article/details/53164604

Android序列化与反序列化相关推荐

  1. Android序列化:Serializable Parcelable

    原文出处:http://blog.csdn.net/jdsjlzx/article/details/51122109?locationNum=14&fps=1 对于Parcel的理解: 在An ...

  2. android序列化异常,关于序列化:错误:Android中的序列化和反序列化

    每次单击按钮时,我都试图保存数据并将其存储在历史记录列表中. 尝试序列化和反序列化数据时出现错误.我不知道我在做什么错. 我能够添加到历史记录列表中,但是当我返回上一个活动并返回时,数据将不持久.在这 ...

  3. 【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )

    文章目录 一.导入依赖库 二.构造 JavaBean 三.fastjson 序列化与反序列化 四.gson 序列化与反序列化 五.完整代码 1.主界面代码 2.JSON 测试代码 3.执行结果 六.参 ...

  4. Android 中的Json解析工具fastjson 、序列化、反序列化

    Android中通常需要访问服务器,然而服务器返回的数据很多时候都是Json格式 1.fastjson简介 阿里巴巴FastJson是一个Json处理工具包,包括"序列化"和&qu ...

  5. Android开发中混淆后Gson序列化、反序列化的那些坑,androidstudio配置

    为什么呢? 因为反序列化创建对象本质还是利用反射, 会根据 json 字符串的 key 作为属性名称, value 则对应属性值. 如何解决 将序列化和反序列化的类排除混淆 使用 @Serialize ...

  6. android 序列化_Android高级架构进阶之数据传输与序列化

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 本篇文章将从以下几个内容来阐述数据传输与序列化: [Serializable原理 ...

  7. 序列化与反序列化(1)Serializable —— Java原生态方法

    摘自:序列化与反序列化(1)Serializable -- Java原生态方法 作者:丶PURSUING 发布时间: 2021-05-08 19:20:21 网址:https://blog.csdn. ...

  8. c语言 ipc 参数 序列化,浅谈IPC通信之序列化与反序列化(三)

    由于进行通信肯定要涉及数据的处理,所以我们需要先了解两个基础的概念,序列化和反序列化. 定义 序列化:将对象转化为可保存的字节序列(注意是对象): 反序列:将字节序列恢复为对象的过程. 序列化和反序列 ...

  9. 分享套接字数据包序列化与反序列化方法

    分享套接字数据包序列化与反序列化方法 " 简单说一下,本文不涉及Socket的连接.数据接收,只是对数据包(byte[])的序列化和反序列化方法的封装介绍. 本文目录 本文背景 一般操作 本 ...

最新文章

  1. 新手问题之找不到R文件
  2. Input.GetAxis 获取轴
  3. centos7重新加载服务的命令_Centos7 常用防火墙操作命令
  4. java 判断是否大于指定版本号
  5. Xamarin.Android开发实践(四)
  6. 【渝粤题库】陕西师范大学209912 金融中介学Ⅰ 作业
  7. 关于win时间同步的解决方案
  8. android camera 降低帧率_深入理解Camera 硬件抽象层
  9. 《Oracle 11g 数据库基础教程》读书笔记:
  10. php针式打印机打多张,如何将多页内容打印在一张A4纸上
  11. bp神经网络简单流程包括,bp神经网络简单实例
  12. linux ssd做raid1,linux 磁盘阵列 raid1搭建教程
  13. index函数在python中的用法_index函数怎么在python中使用
  14. mongodb 建立索引提示异常:WiredTigerIndex::insert: key too large to index, failing 1483
  15. 【DockerCE】使用Portainer-ce管理监控docker容器实例
  16. 实体机安装双系统多系统教程 及引导修复指南
  17. 计算机编程课程顺序_您可以在2月开始免费在线编程和计算机科学课程
  18. Java--Integer
  19. 数据挖掘综合应用:数据预处理代码实战
  20. 教你在ubuntu系统下制作win10的启动u盘,建议收藏起来-win10 u盘

热门文章

  1. swoole 定时器
  2. Linux学习中压缩包格式有哪些?
  3. 【Windows10】安装一些更新时出现问题,但我们稍后会重试
  4. LACP/PAGP的定义与差别—Vecloud微云
  5. Android应用从树莓派读取数据
  6. 解决XManager连接到HP-UX时出现乱码的问题
  7. JAVA-retry 重试
  8. [T-ARA][Goodbye, OK]
  9. Linq let Concat
  10. 转]网络上收集的Visual Studio 2008的一些小技巧