码迷,mamicode.com
首页 > 编程语言 > 详细

java 序列化

时间:2019-05-04 11:33:24      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:htm   exce   对象   方式   一个   转换   详细   返回   编译器   

一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”.

对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。(因为静态static的东西在方法区.)

序列化能把堆内存中的对象的生命周期延长,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了.(存储到硬盘是一个文件,不需要我们去解析,如果用记事本打开解析会出现乱码,解析要用特定的方式,不用我们管. 我们只需要读取). 把对象存储到硬盘上的一个文件中,这个文件的标准扩展名是(.object).

简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反序列化)。

实现方式1 实现接口Serializable

import java.io.Serializable;
 /*
  * Serializable:用于给被序列化的类加入ID号。
  * 用于判断类和对象是否是同一个版本。 
  */
 public class Person implements Serializable/*标记接口*/ {
     /**
      * transient:非静态数据不想被序列化可以使用这个关键字修饰。 
     */
    private static final long serialVersionUID = 1L; 
}

实现方式2 实现接口Externalizable

class Person implements Externalizable{
        private static final long serialVersionUID = 1L;
}

首先,我们在序列化对象的时候,由于这个类实现了Externalizable 接口,在writeExternal()方法里定义了哪些属性可以序列化,

哪些不可以序列化,所以,对象在经过这里就把规定能被序列化的序列化保存文件,不能序列化的不处理,然后在反序列的时候自动调

用readExternal()方法,根据序列顺序挨个读取进行反序列,并自动封装成对象返回,然后在测试类接收,就完成了反序列。

所以说Exterinable的是Serializable的一个扩展。

public interface Externalizable extends java.io.Serializable {

     void writeExternal(ObjectOutput out) throws IOException;

     void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}

实现序列化接口的对象并不强制声明唯一的serialVersionUID,是否声明serialVersionUID对于对象序列化的向上向下的兼容性有很大的影响。

如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值. 原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。

参考文章

http://www.cnblogs.com/xiohao/p/4234184.html
https://www.cnblogs.com/DreamDrive/p/4005966.html
https://www.cnblogs.com/yoohot/p/6019767.html

java 序列化

标签:htm   exce   对象   方式   一个   转换   详细   返回   编译器   

原文地址:https://www.cnblogs.com/lick468/p/10807742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!