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 代码 _程序员用1.5小时写出的Java代码,让同事瞠目结舌!直呼优秀

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

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只…

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

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

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

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

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

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

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

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

java虚拟机规范 51cto_java虚拟机

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

ipv6+ssh+java_IPv6的本地联网地址计算方法详解

IPv6的世界里,如果DHCP6和SLACC这两位大佬都为没有为可怜的网卡分配IP地址,也没有人为网卡设置静态的IP地址,系统就会为网卡计算一个IPv6的网址来。这样的网址只能在本地使用,不得路由,所以,被称为“link-l…

java互斥锁的实现原理_java-深入分析synchronized原理

互斥锁互斥锁futex,全拼fast userspace mutexes,直翻为快速用户空间互斥器,它是我们上层应用实现锁的最常用方法。futex是一块所有进程都可以访问的内存,是通过cpu的原子操作修改内存中的值来尝试获取琐,如果没有竞争&…

京东开普勒php接口,IOS菜鸟初学第十五篇:接入京东开普勒sdk,呼起京东app打开任意京东的链接-Go语言中文社区...

我之前写了一篇关于接入京东联盟sdk的文章,但是最近,由于这个原因,如下图导致需要重新集成京东的sdk,但是由于某种原因,因为android和ios端不统一,android接入的是京东开普勒的SDK,这次为了统一…

oracle安装过程掉电,Oracle数据库掉电后ORA-01172磁盘坏块解决方法

由于服务器突然掉电,重启机器后发现数据库无法启动。数据库版本 Oracle10201,OS REDHAT 5.4数据库无归档,无备份 [oraclehuna由于服务器突然掉电,重启机器后发现数据库无法启动。数据库版本 Oracle10201,,O…

linux删除了mount目录,Linux记录-分区(df/fdisk/mount/umount/fuser)

1.查看磁盘挂载(df -TH)2.卸载umount /dev/vdb13.查杀用户进程(fuser -m -v -i -k /dev/vdb1)4.再次卸载umount /dev/vdb1,并查看挂载信息df -TH5.删除分区(fdisk /dev/vdb m d 1 d w)6.查看分区(fdisk -l,没有Start-End磁盘分区表示可用)7.添加分区(fdi…

linux中pak命令,如何在Linux系统中安装Flatpak

选择你的Linux发行版快速安装Flatpak及使用Flatpak。支持Ubuntu、Fedora、Red Hat Enterprise Linux、Deepin、Endless OS、Linux Mint、openSUSE、Arch、Debian、CentOS、Gentoo、Solus、Alpine、Mageia、Pop!_OS、elementary OS、Raspbian。以下为你逐一介绍如何在这些Linux版…

ubuntu 改linux密码忘了怎么办,Ubuntu 14.04忘记root密码的解决方法

电脑20多天没用,忘记Ubuntu 14.04 root密码了,下面是在网上找到的一个解决办法,其它的和这个也大概相同。因为其中有些缺漏,没能给我解决问题。通过分析最终问题还是解决了,现解决方案的关键点记录一下。希望能方便到其…

linux设置历史命令保留数目限制,linux下修改history命令保存条数

在linux系统下、history命令会保存多少条命令呢?曾在一本书上说,如果注销系统,那么会将所有的历史命令都定入到~/.bash_history,但只保留1000条命令(这个是由默认的shell变量所设置了的)但是为什么我们执行history命令后会出现大于1000条的历…

android 手机壁纸源码,Android工程实现换壁纸功能【附源码】

最近工作要实现换壁纸小功能,将代码做成demo发出来没有采用zip格式换肤,因为只是更换一张图片背景1.将三张图放入drawable-hdpi,我放的是480*800的2.用sharedPreference存取皮肤的id,以便于下次启动的时候根据id来选择用哪个皮肤,在onresume()里刷新皮肤3.存到sharedPreference…

android webview 加载本地,webview加载本地资源的各种尝试

1.webview 打开sd卡上的静态html文件 ,js文件既然放在assets文件夹下能找到,那能通过放在sd卡,能加载吗?答:事实证明,是没有用的。2.既然能拿到html的数据,那我们是不是重写html的script的tag的…

apple手表android手机,Apple Watch 4发布了,安卓手机用户如何选择呢?

Apple Watch 4发布了,安卓手机用户如何选择呢?2018年09月13日 17:40作者:黄页编辑:黄页分享一年一度的“科技界春晚”苹果新品发布在今天凌晨举行。苹果带来了新一代的智能手表——Apple Watch Series 4系列。作为“课代表”,科技…