java 序列化实例_Java中的序列化与反序列化实例
创建的字节流与平台无关。因此,在一个平台上序列化的对象可以在另一个平台上反序列化。
为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口。
ObjectOutputStream类包含writeObject()序列化对象的方法。
public final voidwriteObject(Object obj)throws IOException
ObjectInputStream类包含readObject()用于反序列化对象的方法。
public finalObject readObject()throwsIOException,ClassNotFoundException
1、序列化的优点
保存/保持对象的状态。
在网络中传输一个物体。
只有那些类的对象可以序列化,这些类正在实现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…]
例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关键字定义的变量在序列化过程中未序列化。在反序列化期间,将使用类中定义的当前值加载此变量。
java 序列化实例_Java中的序列化与反序列化实例相关推荐
- java二分法查找_java 中二分法查找的应用实例
java 中二分法查找的应用实例 二分查找的前提是:数组有序 注意:mid的动态变化,否则出错!!! 实例代码: public class BiSearch { public static void ...
- java jtable组件_java中jtable组件详解实例
java中jtable组件详解实例 java 表格控件 JTable 常用操作详解 JTable 是 Swing 编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处.一 ...
- java servlet 请求_Java中前台JSP请求Servlet实例(http+Servlet)
1.前台jsp代码 himily.jsp,定义了用户名和密码两个输入框,使用post方式提交:/order-web/HimilyServlet其中order-web为站点名称,HimilyServle ...
- java 不定参数_java中不定长参数的实例用法
java中不定长参数的使用方法 不定长参数方法的语法如下: 返回值 方法名(参数类型...参数名称) 在参数列表中使用"..."形式定义不定长参数,其实这个不定长参数a就是一个数组 ...
- java序列化库_java 中序列化(Serializable)
18年5月份,在毕业快一年的时候,我终于把自己从研发助理偏向行政打杂,偶尔写一些前端代码的处境,回归到了初衷-安安静静写前后端代码的小小程序员~过程中的心酸也就不在这里吐啦,毕竟我是小太阳,永不熄灭的 ...
- java中序列化与反序列化_Java中的序列化
java中序列化与反序列化 Java提供了一种称为序列化的机制,以按字节的有序或字节序列的形式持久化Java对象,其中包括对象的数据以及有关对象的类型和存储在对象中的数据类型的信息. 因此,如果我们已 ...
- java 序列是什么意思_java 中的序列化是什么意思?有什么好处?
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比 ...
- java kryo 序列化_java中的序列化方式及dubbo使用kryo序列化
java中的序列化方式: 1. 自带序列化 ObjectInputSteam. ObjectOutStream等 2. hession2 3. json ,xml等格式 4.kryo 5.FST - ...
- java 不能反序列化_java中的序列化与反序列化
序列化就是将一个对象以及他的属性写入一个文件,保存在存中对象的状态 反序列化就是把保存的对象状态再读出来 实现序列化与反序列化就要使用到IO操作中文件的字节流输入与输出 inputStream与out ...
最新文章
- 配置管理之PackageProvider接口
- BZOJ3514:GERALD07加强版(LCT,主席树)
- python3 正则表达式点星问号(.*?)能不能匹配换行符?不能的话应该怎么写
- 前端基础之CSS_1
- Spark-Sql整合hive,在spark-sql命令和spark-shell命令下执行sql命令和整合调用hive
- TCP/IP学习笔记(二)TCP三次握手
- 通过java类的反射机制获取类的属性类型
- 知乎搜索框背后的Query理解和语义召回技术
- node+express项目链接MySQL数据库(最简单版)
- 学术谱系树:来看看你导师的师承
- Git—代码管理、提交及冲突解决流程的思考
- Good Bye 2017
- iOS AFNetWorking源码详解(一)
- 使用Canvas基于手势可以使树秋千
- Android 调试桥 (adb)
- 英文网站建设应该如何做?如何建好一个英文网站?
- 西安电子科技大学超级计算机,西安电子科技大学超级计算机投入使用
- 【懒人神器】鼠标自动连续点击器免费下载
- 使用pymysql报错RuntimeError ‘cryptography‘ package is required for sha256_password or caching_sha2_passw
- python提取Excel某几列数据
热门文章
- 线程停止继续_晓龙吊打面试官系列: 如何优雅的停止一个线程
- python工具箱查询手册书籍京东_十二. 项目实战:爬取京东商城中的书籍信息
- 找到一个或多个多重定义的符号_初中数学之相反数,总结规律,学会多重符号的化简...
- OpenCV学习(二十) :分水岭算法:watershed()
- OpenCV学习笔记(十六):直方图均衡化:equalizeHist()
- Linux学习之嵌入式Linux编程文件IO(C语言版)
- duilib消息事件产生和分发解释
- 安卓逆向_13 --- AndroidStudio + Smalidea 动态调试 smali 代码【APK可调试】、gradle 配置
- 开源 Python网络爬虫框架 Scrapy
- ThoughtWorks洞见领域驱动设计思维导图笔记