java 序列化实例_Java中的序列化与反序列化实例

e104f67f0d9e91bd5a2a913ee775d307.png

创建的字节流与平台无关。因此,在一个平台上序列化的对象可以在另一个平台上反序列化。

为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口。

ObjectOutputStream类包含writeObject()序列化对象的方法。

public final voidwriteObject(Object obj)throws IOException

ObjectInputStream类包含readObject()用于反序列化对象的方法。

public finalObject readObject()throwsIOException,ClassNotFoundException

1、序列化的优点

保存/保持对象的状态。

在网络中传输一个物体。

77ddd6bf72fdd9a556040ed2dbc3d10b.png

只有那些类的对象可以序列化,这些类正在实现java.io.Serializable可序列化接口。

可序列化是标记接口(没有数据成员和方法)。它用于“标记”java类,以便这些类的对象可以获得一定的功能。标记接口的其他示例包括:Cloneable and Remote.

2、要点

1如果父类实现了可序列化接口,则子类不需要实现它,反之亦然。

2只有非静态数据成员通过序列化过程保存。

3static数据成员和transient数据成员不会通过序列化过程保存。所以,如果您不想保存非静态数据成员的值,请将其设为transient。

4反序列化对象时从不调用对象的构造函数。

5关联对象必须实现可序列化接口。

例子:

class A implementsSerializable{//B also implements Serializable//interface.

B ob=newB();

}

3、SerialVersionUID(序列号)

序列化运行时将一个版本号与每个称为SerialVersionUID的可序列化类相关联,在反序列化过程中使用该序列号验证序列化对象的发送方和接收方是否为该对象加载了与序列化兼容的类。如果接收方为对象加载的类的UID与相应发送方类的UID不同,则反序列化将导致InvalidClassException. 可序列化类可以通过声明字段名来显式声明自己的UID。

它必须是static、final和long类型。

l例如:(public/private/protected/default) static final long serialVersionUID=42L;

如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据类的各个方面为该类计算默认值,如Java对象序列化规范中所述。但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为它的计算对类细节高度敏感,这些细节可能因编译器实现而异,因此类中的任何更改或使用不同的id都可能影响序列化的数据。

还建议对UID使用private修饰符,因为它作为继承成员没有用处。

4、serialver(串行器)

serialver是JDK附带的工具。它用于获取Java类的serialVersionUID号。

您可以运行以下命令来获取serialVersionUID

serialver [-classpath classpath] [-show] [classname…]

959648a6be5cc51d4964d2d009b65721.png

例1:

//Java code for serialization and deserialization//of a Java object

import java.io.*;class Demo implementsjava.io.Serializable

{public inta;publicString b;//Default constructor

public Demo(inta, String b)

{this.a =a;this.b =b;

}

}classTest

{public static voidmain(String[] args)

{

Demo object= new Demo(1, "geeksforgeeks");

String filename= "file.ser";//Serialization

try{//Saving of object in a file

FileOutputStream file = newFileOutputStream(filename);

ObjectOutputStream out= newObjectOutputStream(file);//Method for serialization of object

out.writeObject(object);

out.close();

file.close();

System.out.println("Object has been serialized");

}catch(IOException ex)

{

System.out.println("IOException is caught");

}

Demo object1= null;//Deserialization

try{//Reading the object from a file

FileInputStream file = newFileInputStream(filename);

ObjectInputStream in= newObjectInputStream(file);//Method for deserialization of object

object1 =(Demo)in.readObject();

in.close();

file.close();

System.out.println("Object has been deserialized ");

System.out.println("a = " +object1.a);

System.out.println("b = " +object1.b);

}catch(IOException ex)

{

System.out.println("IOException is caught");

}catch(ClassNotFoundException ex)

{

System.out.println("ClassNotFoundException is caught");

}

}

}

输出:

Object has been serialized

Object has been deserialized

a= 1b= geeksforgeeks

例2:

//Java code for serialization and deserialization//of a Java object

import java.io.*;class Emp implementsSerializable {private static final long serialversionUID =

129348938L;transient inta;static intb;

String name;intage;//Default constructor

public Emp(String name, int age, int a, intb)

{this.name =name;this.age =age;this.a =a;this.b =b;

}

}public classSerialExample {public static voidprintdata(Emp object1)

{

System.out.println("name = " +object1.name);

System.out.println("age = " +object1.age);

System.out.println("a = " +object1.a);

System.out.println("b = " +object1.b);

}public static voidmain(String[] args)

{

Emp object= new Emp("ab", 20, 2, 1000);

String filename= "shubham.txt";//Serialization

try{//Saving of object in a file

FileOutputStream file = newFileOutputStream

(filename);

ObjectOutputStream out= newObjectOutputStream

(file);//Method for serialization of object

out.writeObject(object);

out.close();

file.close();

System.out.println("Object has been serialized\n"

+ "Data before Deserialization.");

printdata(object);//value of static variable changed

object.b = 2000;

}catch(IOException ex) {

System.out.println("IOException is caught");

}

object= null;//Deserialization

try{//Reading the object from a file

FileInputStream file = newFileInputStream

(filename);

ObjectInputStream in= newObjectInputStream

(file);//Method for deserialization of object

object =(Emp)in.readObject();

in.close();

file.close();

System.out.println("Object has been deserialized\n"

+ "Data after Deserialization.");

printdata(object);//System.out.println("z = " + object1.z);

}catch(IOException ex) {

System.out.println("IOException is caught");

}catch(ClassNotFoundException ex) {

System.out.println("ClassNotFoundException" +

" is caught");

}

}

}

输出:

Object has been serialized

Data before Deserialization.

name=ab

age= 20a= 2b= 1000Object has been deserialized

Data after Deserialization.

name=ab

age= 20a= 0b= 2000

输出说明:

在反序列化对象时,您已经看到a和b的值发生了更改。原因a是transient修饰 ,b是static修饰。

transient:在序列化过程中,使用transient关键字定义的变量未序列化。在反序列化期间,将使用默认值初始化此变量。(例如:Object为null,int为0)

static:使用static关键字定义的变量在序列化过程中未序列化。在反序列化期间,将使用类中定义的当前值加载此变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java map for循环遍历_java中Map遍历的四种方式

java中Map遍历的四种方式在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方式去遍历。方法一:在for循环中使用entries实现Map的遍历:/*** 最常见也是大多数情况下用的最多的…

java 代码 _程序员用1.5小时写出的Java代码,让同事瞠目结舌!直呼优秀

1.曾经不止一次在生产中见过类似这样的代码:这有很多变种,例如用 Integer.valueOf(1)、 (Integer)1 之类的,那些细节都不重要。重要的是:凭空用一个 Integer 对象作为锁对象。2.AbstractComponentBuilderTemplateFactory3.HelloWo…

java保存文件到linux指定目录_怎么使用java编程实现linux下全部文件目录的遍历

为了避免目录列举消耗时间过长,请指定一个目录来模拟,命令行参数:代表路径的字符串.如果认可代码,请加分50,谢谢----import javax.swing.*;import javax.swing.tree.*;import java.awt.*;import java.io.*;final public class FileTree extends JFrame {public FileTree(File d…

avro 序列化java_Avro 对象序列化与反序列化,及转Json对象序列化处理

Avro 工具类 序列化与反序列化public class AvroHelper {public byte[]serializeAvroToByteArray(List dcs) {try {ByteArrayOutputStream baos new ByteArrayOutputStream();DatumWriter pictureDatumWriter new SpecificDatumWriter();DataFileWriter dataFileWriter new Da…

java监听剪贴板_在java中实现windows剪贴板监视

在google上搜了一把,结果搜到了自己原创的文章,不胜窃喜。于是重新格式化了一下,重发之。 package com.ibm.bloghelper; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.F…

mysql workbench 从model建库_使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结...

转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/48318877 本文出自【我是干勾鱼的博客】 1 简单介绍MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。你能够用MySQL Workbench设计和创…

mysql5.7 hibenate5.1_5.7 Spring与Hibernate整合应用

下面以一个简单的实例说明Spring与Hibernate的整合策略,步骤如下。1 在SQL Server 2005中创建数据库表数据库名为XSCJ,表见附录A的登录表。2 创建Web项目命名为“Hibernate_Spring”3 添加Spring的开发能力右击项目名,选择【MyEclipse】→【A…

java 多进程多线程_Java并发编程原理与实战三:多线程与多进程的联系以及上下文切换所导致资源浪费问题...

一、进程考虑一个场景:浏览器,网易云音乐以及notepad 三个软件只能顺序执行是怎样一种场景呢?另外,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只…

mysql适合什么阵列_如何选择最合适的RAID级别

众所周知,最常用的RAID配置等级分别是RAID-0、RAID-1、RAID-5。这三种RAID等级针对数据的传输速度和保护程度都有所不同:RAID-0(数据 条带化存储阵列)旨在提供速度,在所有RAID中速度最快,但是提供的保护最少;RAID-1(透明或条带化存储镜像)这种…

python写if语句_python if语句

## Python条件和If语句Python支持数学中通常的逻辑条件&#xff1a;* 等于&#xff1a;a b* 不等于&#xff1a;a&#xff01; b* 小于&#xff1a;a * 小于或等于&#xff1a;a < b* 大于&#xff1a;a> b* 大于或等于&#xff1a;a> b这些条件可以几种方式使用&am…

python用法查询笔记_Python爬虫学习笔记(三)

handler处理器自定义 - Cookies && URLError && json简单使用Cookies&#xff1a;以抓取https://www.yaozh.com/为例Test1(不使用cookies)&#xff1a;代码&#xff1a;import urllib.request# 1.添加URLurl "https://www.yaozh.com/"# 2.添加请求头…

java 线程 交给spring_浅谈Java中spring 线程异步执行

多线程并发处理起来通常比较麻烦&#xff0c;如果你使用spring容器来管理业务bean&#xff0c;事情就好办了多了。spring封装了Java的多线程的实现&#xff0c;你只需要关注于并发事物的流程以及一些并发负载量等特性&#xff0c;具体来说如何使用spring来处理并发事务&#xf…

java编程实现素数环_结对编程(JAVA实现)

项目成员&#xff1a;黄思扬(3117004657)、刘嘉媚(3217004685)二、PSP表格PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)Planning计划6040 Estimate 估计这个任务需要多少时间6040Development开发14401505 Analysis 需求分析3015 Design Spec 生成设计文档…

自学java编译老是出错_为什么按照书上的代码,编译老是出错?

老是又小伙伴在群里说我的代码是按照书上的代码敲的&#xff0c;就是编译不过&#xff1f;想不通呀&#xff01;目前市面上的一些书都是十来年以前编写的了&#xff0c;你不幸看的还是这些书&#xff0c;错误原因就在这里。比如谭浩强的C语言程序设计这个本书都出了N版了&#…

java版的中世纪战争_世界战争英雄设置-火焰纹章英雄英雄地图及AI命令设置

英雄地图及AI命令设置游戏中练级塔中的AI设置和故事地图中的一样&#xff0c;所以如果故事地图中的AI是主动出击的&#xff0c;那练级塔一样的地图也是主动出击。故事地图中配置有5个敌人&#xff0c;在练级塔中也一样会配置5个敌人。不同的是职业可能会发生变化&#xff0c;但…

python pip安装依赖的常用软件源

目录 引言 一、什么是镜像源&#xff1f;​​​​​​​ 二、清华源 三、阿里源 四、中科大源 五、豆瓣源 六、更多资源 引言 在软件开发和使用过程中&#xff0c;我们经常需要下载和更新各种软件包和库文件。然而&#xff0c;由于网络环境的限制或者服务器的负载&#…

java虚拟机规范 51cto_java虚拟机

最近学习java虚拟机做了一些整理&#xff0c;会陆续发完。Java虚拟机一、概念&#xff1a;当我们谈到java虚拟机的时候&#xff0c;有可能指下面3个方面&#xff1a;1)&#xff1a;抽象java虚拟机的规范。2)&#xff1a;一个java虚拟机具体的实现。------实现是指&#xff1a;实…

java重定向链接页面变小_java web的进来看一下!页面重定向的异常!帮忙看一下!谢谢了!...

我用login.jsp进行登录留言板的管理页面用一个servlet进行身份验证。成功----->通过request.getRequestDispatcher("/admin/secure/manage?qlist").forward(request, response);return;其中/admin/secure/manage是ManageServlet的映射路径。来登录到manage的管理…

java数组设置结束_Java 数组最佳指南,快收藏让它吃灰

两年前&#xff0c;我甚至写过一篇文章&#xff0c;吐槽数组在 Java 中挺鸡肋的&#xff0c;因为有 List 谁用数组啊&#xff0c;现在想想那时候的自己好幼稚&#xff0c;好可笑。因为我只看到了表面现象&#xff0c;实际上呢&#xff0c;List 的内部仍然是通过数组实现的&…

java窗口只能点一个_java – 为什么界面只能在顶级类中声明?

Won’t inner class become top-level class if I put it into another Class file?不,它仍然是一个内部类,文件名指示(IIRC它是OuterClass $InnerClass.class).内部类可以访问外部类的属性,即它们依赖于它们的外部类’实例.使用界面,您无法做到这一点.想到一个完全不相关的类…