程序猿浅谈JAVA的序列化

序列化,是我们在开发过程中经常会碰到的问题。经常会看到一个类(Class)实现Serializable接口。这里就是实现序列化。

今天小编就来聊聊什么是序列化。

Java是面向对象编程,对象保存了一个类的完整的数据。但是Java有自己专门的垃圾回收机制,当一个对象不再被使用,就会被回收,释放空间。如果我们想长久地保存一个对象的数据该怎么办呢?这个时候就用到序列化了。

序列化就是将对象的状态信息转换为可以存储或者传输的过程。在序列化期间,对象将其当前的状态写入到临时或者持久性存储区。以后可以通过从存储区读取或者反序列化对象的状态,重写创建该对象。通过序列化,不仅可以持久化存储一个对象,也方便不同的程序之间共享对象的数据,同时程序维护起来也更方便。

如何实现序列化呢?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

    import java.io.Serializable;    

    

    public class Person implements Serializable{

        private static final long serialVersionUID = 1L;

        

        public String name;

        public int age;

        public double money;

        private static final long serialVersionUID = 1L;

    

    public Person(String name, int age, double money) {

        this.name = name;

        this.age = age;

        this.money = money;

    }

    

    @Override

    public String toString() {

        return "name is:"+name+" , age is:"+age+" , money is:"+money;

    }

    }

这里我们发现一个类实现一个接口却没有要实现的方法。这是因为,类通过实现Serializable接口是来启动序列化功能。序列化接口没有方法和字段,仅仅用于标识可序列化。这里需要强调的是,可序列化的子类都是可序列化的。序列化是保存对象的数据,如果要获取对象的数据就要反序列化。

序列化和反序列化是通过writeObejct()和readObject()两个方法实现的。

writeObject()方法负责写入特点类的对象状态。通过调用 out.defaultWriteObject 可以调用保存 Object
的字段的默认机制,该方法本身不需要涉及属于其超类或子类的状态。

readObject()方法负责从流中读取并恢复类字段。它可以调用 in.defaultReadObject 来调用默认机制,以恢复对象的非静态和非瞬态字段。

一个java文件序列化一个对象


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.ObjectOutputStream;

    

    public class DemoText01 {

    

        public static void main(String[] args) {

            

            Person person = new Person("joinName"20100.89);

            

            //序列化对象 -->只有可序列化的类,对象才能序列化

            try {

                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/save.txt"));

                oos.writeObject(person);

                System.out.println("保存对象");

                oos.close();

                

            catch (FileNotFoundException e) {

                e.printStackTrace();

            catch (IOException e) {

                e.printStackTrace();

            

        }

    }

另一个java文件反序列化一个对象


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.IOException;

    import java.io.ObjectInputStream;

    

    public class DemoText02 {

    

        public static void main(String[] args) {

    

            try {

                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/save.txt"));

                    Person person = (Person) ois.readObject();

                    System.out.println(person);

                    ois.close();

            catch (FileNotFoundException e) {

                e.printStackTrace();

            catch (IOException e) {

                e.printStackTrace();

            catch (ClassNotFoundException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

需要强调生产的save文件类型可以是任意类型。

欢迎大家访问我的个人网站 萌萌的IT人

时间: 2024-07-29 20:10:50

程序猿浅谈JAVA的序列化的相关文章

浅谈 Java 主流开源类库解析 XML

在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一试. Jdom/Dom4j/Xstream... 基于底层解析方式重新组织封装的开源类库,简洁明了的 API,稳定高效的运行表现. Dom4j 基于 JAXP 解析方式,性能优异.功能强大.极易使用的优秀框架.想了解底层解析方式请翻看:浅谈 Java XML 底层解析方式 Jdom 你细看内部代码,

浅谈 Java Printing

浅谈 Java  Printing 其实怎么说呢?在写这篇博文之前,我对java printing 可以说是一无所知的.以至于我在敲文字时, 基本上是看着api文档翻译过来的.这虽然看起来非常的吃力,但是我相信,有道大哥不会辜负我的.嘻 嘻! Java Printing 技术,也就是我们平时所接触的打印,只不过是说可以用Java实现而已. 一.Java Printing 打印简介 Java Printing API能够使java应用程序实现相关的打印功能,如: 1.打印所有 Java 2D 和

浅谈java异常[Exception]

本文转自:focusJ 一. 异常的定义 在<java编程思想>中这样定义 异常:阻止当前方法或作用域继续执行的问题.虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常.绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败.之所以java要提出异常处理机制,就是要告诉开发人员,你的程序出现了不正常的情况,请注意. 记得当初学习java的时候,异常总是搞不太清楚,不知道这个异常是什么意思,为什么会有这个机制?但是随着知识的积累逐渐也

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

浅谈Java throw, throws, try catch异常处理

1.throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象.如下面例子所示: public class Shoot {   创建类 static void pop() throws NegativeArraySizeException { //定义方法并抛出NegativeArraySizeException异常 int [] arr = new int[-3];//创建数组 } public

浅谈Java中的hashcode方法 - 海 子

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程

浅谈Java中的对象和对象引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: “按照通俗的说法,每个对象都是某个类(class)的一个实

浅谈java类集框架和数据结构(2)

继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主要有最重要的三种实现:ArrayList,Vector,LinkedList,三种List均来自AbstracList的实现,而AbstracList直接实现了List接口,并拓展自AbstractCollection. 在三种实现中,ArrayList和Vector使用了数组实现,可以认为这两个是

浅谈JAVA中的“hashcode()”方法

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 一.hashCode方法的作用 对于包含容器类型的程