关于序列化接口的理解

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

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

把对象存储到硬盘上的一个文件中,这个文件的标准扩展名是(.object).

在很多框架中就会有这种.object结尾的文件,因为很多对象都不创建,创建起来太麻烦,直接读取,而且有些对象的值你不知道,框架封存在.object文件中,直接读取这个文件中的这个值就行了,不需要传这个值.

 1 import java.io.Serializable;
 2 /*
 3  * Serializable:用于给被序列化的类加入ID号。
 4  * 用于判断类和对象是否是同一个版本。
 5  */
 6 public class Person implements Serializable/*标记接口*/ {
 7     /**
 8      * transient:非静态数据不想被序列化可以使用这个关键字修饰。
 9      */
10     private static final long serialVersionUID = 9527l;
11 //    private transient String name;
12     private  String name;
13 //    private static int age;
14     private int age;
15
16     public Person(String name, int age) {
17         super();
18         this.name = name;
19         this.age = age;
20     }
21     public String getName() {
22         return name;
23     }
24     public void setName(String name) {
25         this.name = name;
26     }
27     public int getAge() {
28         return age;
29     }
30     public void setAge(int age) {
31         this.age = age;
32     }
33 }
 1 public class ObjectStreamDemo {
 2     /**
 3      * @param args
 4      * @throws IOException
 5      * @throws ClassNotFoundException
 6      */
 7     public static void main(String[] args) throws IOException, ClassNotFoundException {
 8         //writeObj();
 9         readObj();
10     }
11     public static void readObj() throws IOException, ClassNotFoundException {
12         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.object"));
13         //对象的反序列化。
14         Person p = (Person)ois.readObject();
15         System.out.println(p.getName()+":"+p.getAge());
16         ois.close();
17     }
18
19     public static void writeObj() throws IOException, IOException {
20
21         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.object"));
22         //对象序列化。  被序列化的对象必须实现Serializable接口。
23         oos.writeObject(new Person("小强",30));
24         oos.close();
25     }
26 }

序列号的作用:举个例子,当你一开始对这个person类进行序列化的时候用的是private类型序列化的,但是你在反序列化之前,把这个private改成了public.这样反序列化读取的时候就会报出异常.

Exception in thread "main" java.io.InvalidClassException: cn.itcast.serializable.Person; local class incompatible: stream classdesc serialVersionUID = 9527, local class serialVersionUID = 7915096815468332737

就是关于前后这个Person类的版本号不统一.如果加上设定一个版本号,那么经过上面的修改也是可以反序列化的.

@throws ClassNotFoundException

如果只有obj.object 这个文件能不能把其中的对象Person取出来,因为任何对象在堆内存中创建都必须依赖于该对象所属的类文件(class文件),如果仅仅给了obj.object,这个里面有Person对象的字节码,可是取出的时候你内存中并没有Person.class文件,没有,所以取不出来,所以必须要有obj.object文件和Person.class文件.(所以有一个ClassNotFound异常)

类 ObjectInputStream

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

这句话的意思就是ObjectInputStream只能读取ObjectOutputStream的.

ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。

序列化就是按照顺序排列

Serializable就是一个标记,(要想实现序列化必须有这个标记)

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

使用时候:对某些特点的对象,比如数据库连接对象,存储特定数据的对象 ,这样对象你不想创建他们,想存储起来,让他们的生命周期延长,可以把他们放在硬盘当中.每次系统启动的时候都到.object中读取对象和里面的数据,这个时候就可以把他们序列化来完成.

仅仅是把对象从堆内存存储到了硬盘上.

接口 Serializable

序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联. 该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。(当一个对象进行序列化的时候,给该类分配一个id号.这个id号可以用来验证.你给给我的文件存储的对象和你给我的类到底是不是同一版本的啊….)

这个ID号是根据类的特征和类的签名算出来的.为什么ID号那么长,是因为为了避免重复.

所以Serializable是给类加上id用的. 用于判断类和对象是否是同一个版本。

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

在学web的时候一些类就需要实现序列化接口,因为服务器就会对你的对象进行临时本地存储.它怕服务器崩了的以后,你的会话都被消失了.所以存储在了硬盘上,你重新启动服务器会恢复之前的会话,恢复对象,你之前运行的东西都在.

时间: 2024-11-11 03:58:19

关于序列化接口的理解的相关文章

Java Serializable(序列化)的理解和总结、具体实现过程(转)

原文地址:http://www.apkbus.com/forum.php?mod=viewthread&tid=13576&fromuid=3402 Java Serializable(序列化)的理解和总结.具体实现过程 内存中的对象是怎么存在的?  内存中各种对象的状态是?  实例变量是什么(指的是实例化的对象吗)?    使用序列化的好处是什么? 1.序列化是干什么的?        简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出

对Java Serializable(序列化)的理解和总结(转)

转自:https://www.cnblogs.com/qq3111901846/p/7894532.html 1.序列化是干什么的?       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化. 2.什么情况下需要序列化       a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候: 

Java序列化(Serialization)的理解

1.什么是序列化 Java是面向对象的编程语言,有时需要保存对象,并在下次使用时可以顺利还原该对象.由于这种需求很常见,所以Java API对此提供了支持,添加相关程序代码到标准类库中,并将保存和还原的过程称之为"对象序列化". Java SE7 文档中将与对象序列化的相关内容做了详细表述,将其称为: "Java对象序列化规范"  Java Object Serialization Specification,网址为: http://docs.oracle.com/

序列化接口的id的作用

对象经常要通过IO进行传送,让你写程序传递对象,你会怎么做?把对象的状态数据用某种格式写入到硬盘,Person->"zxx,male,28,30000"Person,既然大家都要这么干,并且没有个统一的干法,于是,sun公司就提出一种统一的解决方案,它会把对象变成某个格式进行输入和输出,这种格式对程序员来说是透明(transparent)的,但是,我们的某个类要想能被sun的这种方案处理,必须实现Serializable接口. ObjectOutputStream.writeOb

android ipc通信机制之二序列化接口和Binder

IPC的一些基本概念,Serializable接口,Parcelable接口,已经Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelable接口都是可以完成对象的序列化过程. 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 两者均可以实现序列化并且都可以用于Intent数

接口的理解

这个是自己的理解,因为我也是刚开始编程的菜鸟,所以会有很多错误,欢迎大家指导! 首先按我的理解来说一个例子(这个例子被很多人提过,下面的这个是按我自己的理解来说的): 小王是一个苦逼(酷毙)程序员,他要开发一个程序,其中要实现一个功能:连接到一个数据库,要对数据库进行一些操作.实现功能首先需要有一个数据库,在开发的时候他使用的A厂家的数据库.假设A厂家提供的类库中实现小王需要的功能的类是DataA,小王创建一个DataA实例,然后调用DataA类中的方法.假设DataA类连接数据库的方法为Con

关于Java中继承和接口的理解

关于Java中继承和接口的理解 Java语言中,为了实现代码重用,设计了继承这一机制,但是,其设计成单继承,这样设计是有原因的,如下图: Figure1:deadly diamond of death 此图问题称为菱形问题(diamond problem),就是说,当A的子类B和C同时实现了A中的方法,则同时继承了B和C的子类D在调用该方法时会出现混乱,无法得知该调用哪一个方法. 既然不能实现多继承,我们就会考虑把很多方法就写在父类里,或者继承抽象类,实现其方法,但是,这样会导致一个问题,比如说

【转】C#中对IDisposable接口的理解

IDisposable接口定义:定义一种释放分配的资源的方法. .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象 最简单的办法可以通过实现Finalize()来释放非托管资源,因为GC在释放对象时会检查该对象是否实现了 Finalize() 方法. 有一种更好的,那就是通过实现一个接口显式的提供给客户

C#中对IDisposable接口的理解

http://blog.sina.com.cn/s/blog_8abeac5b01019u19.html 本人最近接触一个项目,在这个项目里面看到很多类实现了IDisposable接口.在我以前的项目中都很少用过这个接口,只知道它是用来手动释放资源的.这么多地方用应该有它的好处,为此自己想对它有进一步的了解,但这个过程远没有我想象中的简单. IDisposable接口定义:定义一种释放分配的资源的方法. .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放