问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

什么是java的序列化?jdk如何实现java序列化

发布网友 发布时间:2022-04-23 22:45

我来回答

1个回答

热心网友 时间:2022-04-09 07:47

Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨。
1.Java序列化与反序列化

Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。

2.为什么需要序列化与反序列化

我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上
传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?这就需要Java序列化与反序列化了。换句话说,一方
面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象。

当我们明晰了为什么需要Java序列化和反序列化后,我们很自然地会想Java序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

3.如何实现Java序列化与反序列化

1)JDK类库中序列化API

java.io.ObjectOutputStream:表示对象输出流

它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream:表示对象输入流

它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

2)实现序列化的要求

只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常。

3)实现Java对象序列化与反序列化的方法

假定一个Student类,它的对象需要序列化,可以有如下三种方法:

方法一:若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化

ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。

ObjcetInputStream采用默认的反序列化方式,对对Student对象的非transient的实例变量进行反序列化。

方法二:若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。

ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。

ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。

方法三:若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。

ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。

ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。

4)JDK类库中序列化的步骤

步骤一:创建一个对象输出流,它可以包装一个其它类型的目标输出流,如文件输出流:

ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“D:\\objectfile.obj”));

步骤二:通过对象输出流的writeObject()方法写对象:

out.writeObject(“Hello”);

out.writeObject(new Date());

5)JDK类库中反序列化的步骤

步骤一:创建一个对象输入流,它可以包装一个其它类型输入流,如文件输入流:

ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\\objectfile.obj”));

步骤二:通过对象输出流的readObject()方法读取对象:

String obj1 = (String)in.readObject();

Date obj2 = (Date)in.readObject();

说明:为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。

为了更好地理解Java序列化与反序列化,选择方法一编码实现。

Student类定义如下:

[java] view plain copy
package com.jieke.io;
import java.io.Serializable;

/**
*Title:学生类
*Description:实现序列化接口的学生类
*Copyright: copyright(c) 2012
*Filename: Student.java
*@author Wang Luqing
*@version 1.0
*/
public class Student implements Serializable
{
private String name;
private char sex;
private int year;
private double gpa;

public Student()
{

}
public Student(String name,char sex,int year,double gpa)
{
this.name = name;
this.sex = sex;
this.year = year;
this.gpa = gpa;
}

public void setName(String name)
{
this.name = name;
}

public void setSex(char sex)
{
this.sex = sex;
}

public void setYear(int year)
{
this.year = year;
}

public void setGpa(double gpa)
{
this.gpa = gpa;
}

public String getName()
{
return this.name;
}

public char getSex()
{
return this.sex;
}

public int getYear()
{
return this.year;
}

public double getGpa()
{
return this.gpa;
}
}

把Student类的对象序列化到文件O:\\Java\\com\\jieke\\io\\student.txt,并从该文件中反序列化,向console显示结果。代码如下:

[java] view plain copy
import java.io.*;

/**
*Title:应用学生类
*Description:实现学生类实例的序列化与反序列化
*Copyright: copyright(c) 2012
*Filename: UseStudent.java
*@author Wang Luqing
*@version 1.0
*/

public class UseStudent
{
public static void main(String[] args)
{
Student st = new Student("Tom",'M',20,3.6);
File file = new File("O:\\Java\\com\\jieke\\io\\student.txt");
try
{
file.createNewFile();
}
catch(IOException e)
{
e.printStackTrace();
}
try
{
//Student对象序列化过程
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(st);
oos.flush();
oos.close();
fos.close();

//Student对象反序列化过程
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Student st1 = (Student) ois.readObject();
System.out.println("name = " + st1.getName());
System.out.println("sex = " + st1.getSex());
System.out.println("year = " + st1.getYear());
System.out.println("gpa = " + st1.getGpa());
ois.close();
fis.close();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

结果如下所示:

name = Tom

sex = M

year = 20

gpa = 3.6

总结:

1)Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。
2)采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
通过TikTok赚钱原来这么简单! TikTok直播小白入门,从账号运营-带货全流程 新手入门TikTok,从0-1账号运营指南! 试样溶液浓度过大或过小,对测量有何影响 睡觉时头上出汗是怎么回是 EXCEL怎么同时设置多个工作表页码(页码非连续?  2010版本表格制作里同时打印多个工作表双面,页码要连续怎么打... 网易考拉如何取消退货申请 退货退款方法 华铭智能什么时候复牌 华铭智能公司做什么 什么是java序列化,如何实现java序列化? 什么是java序列化,如何实现java序列化 什么是序列化,在java中如何实现序列化? 如何实现java序列化 崇左市人民医院做一次点震激光多少钱? 互联网产品细分领域有哪些常见的商业模式 厦门点阵激光多少钱? 有史以来最赚钱的商业模式是什么? 现代企业比较常用的招商模式有哪些? 什么是商业模式?免费模式是什么? 火锅店最常见的经营模式有什么? 内容营销常见的商业模式有哪些? 电子商务商业模式有哪些 微信转账 为什么 提示交易异常 微信转账对方风险提醒怎么回事 常见的商业模式有哪些?(软考) 徐州点阵激光多少钱一次? 微信转账异常怎么办 微信转账的时候为什么会出现风险提醒 微信转账提示啥 什么是java序列化,如何实现序列化 什么是Java序列化?如何实现序列化? java中如何实现序列化,有什么意义 Java序列化,如何实现 带轩字的男孩名字霸气有哪些? Java中如何实现序列化,有什么意义? 男孩的名字要带个轩字,比如雨轩,什么的给说几个要好听的? 、什么是java序列化,如何实现java序列化?或者请解 释Serializable接口的作用。 男孩的名字要带个轩字,比如雨轩,什么的给说几个要好听的、 java中POJO类为什么要实现序列化 java序列化有什么作用? 爸爸叫柳松,妈妈叫李提,帮忙取好听得男孩名字,最好带轩字 Java中为什么要序列化?什么时候用到序列化? 男孩起名带轩字,连名带姓3字,轩放中间后面都行,详细见补充 java中bigdecimal怎么序列化 帮忙找个带轩字的名字!男孩名两个字! 我姓刘,男孩,想改三个字的名,希望名字里有个“轩”字,名字给的越多越好,最好把寓意带上,谢谢啦 我没有放弃,也不会离你而去。哪怕要分离!这是哪首歌的歌词呀 谁知道《六月的雪》歌词是?! 姓王,急需男孩名字带轩字。求答案、
  • 焦点

最新推荐

猜你喜欢

热门推荐