`
wsql
  • 浏览: 11715350 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

java对象序列化的概念和实现

 
阅读更多


一 序列化的概念和实现方法

序列化的概念就是把一个Object直接转换成为Byte流写到硬盘或者通过网络进行传播。Java序列化技术可以将一个对象的状态写入一个Byte流里,并且可以从其它地方把该Byte流里的数据读出来,重新构造一个相同的对象。这种机制允许将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的序列化机制是RMI、EJB等技术的技术基础。

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象 传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现——将需要被序列化的类实现Serializable接口,根据需求读出或者写入对象。在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。

看例子


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URISyntaxException;
import cn.Test.FileInputAndOutputStream;


public class ObjectIO
{
// 将对象写入文件
public static void Output(String path)
{
Student s = new Student();
s.num = 2;
s.name = "xy2";
s.address = "goodPlace2";
s.wifeName = "nobody2";

File f = new File(path);
FileOutputStream fout = null;
ObjectOutputStream bout = null;
try
{
fout = new FileOutputStream(f);
bout = new ObjectOutputStream(fout);
bout.writeObject(s);
bout.flush();
bout.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}

// 将写入的对象读出
public static void Input(String path)
{
File f = new File(path);
FileInputStream fin = null;
ObjectInputStream bin = null;
try
{
fin = new FileInputStream(f);
bin = new ObjectInputStream(fin);
Student s = (Student) bin.readObject();
System.out.println(s.num + "..." + s.name + "..." + s.address + "..." + s.wifeName);
}
catch (Exception e)
{
e.printStackTrace();
}
}

// writeObject和readObject是线程安全的,传输过程中不允许被并发访问,故对象能不断传来
public static void main(String[] args) throws URISyntaxException
{
String path = FileInputAndOutputStream.class.getClassLoader().getResource("对象文档.txt").toURI().getPath();
Output(path);
Input(path);
}

}

@SuppressWarnings("serial")
class Student implements Serializable
{
int num = 1;
String name = "xy";
String address = "goodPlace";
transient String wifeName = "nobody";
}


二 序列化的注意点

注意点1
如果某个类能够被序列化,其子类也可以被序列化。如果该类有父类,则分两种情况来考虑,如果该父类已经实现了可序列化接口。 则其父类的相应字段及属性的处理和该类相同;如果该类的父类没有实现可序列化接口,则该类的父类所有的字段属性将不会序列化。


注意点2
声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据。


注意点3
在java.io包提供的涉及对象的序列化的类与接口有

ObjectOutput接口
该接口继承DataOutput接口并支持对象的序列化,其writeObject()方法实现存储一个对象。

ObjectInput接口
该接口继承DataInput接口并支持对象的序列化,其readObject()方法实现读取一个对象。

ObjectOutputStream类
该类继承OutputStream类并实现ObjectOutput接口,可调用接口中的writeObject方法。

ObjectInputStream类。
该类继承InputStream类并实现ObjectInput接口,可调用接口中的readObject方法。


注意点4
对于父类的处理时,若父类没有实现序列化接口,则其必须有默认的构造函数,否则编译的时候就会报错。在反序列化的时候,默认构造函数会被调用。若把父类标记为可以序列化,则在反序列化的时候,其默认构造函数不会被调用。因为Java对序列化的对象进行反序列化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成。


参考博客:http://blog.csdn.net/yakihappy/article/details/3979373

分享到:
评论

相关推荐

    Java中对象序列化与反序列化详解

    主要介绍了Java中对象序列化与反序列化,较为详细的分析了java中对象序列化的概念、原理、实现方法及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    对象序列化是Java编程中的必备武器 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第4页。 5.2.2 序列化应用 当你想把内存中的对象状态保存到一个文件中或者数据库中时候; 当你想用套接字在...

    java-Hadoop序列化

     序列化概念  序列化(Serialization)是指把结构化对象转化为字节流。  反序列化(Deserialization)是序列化的逆过程。即把字节流转回结构化对象。  Java序列化(java.io.Serializable)  Hadoop序列化...

    Java对象序列化操作详解

    主要介绍了Java对象序列化操作,简单描述了Java序列化相关概念、原理并结合实例形式总结分析了常见序列化操作相关定于与使用技巧,需要的朋友可以参考下

    ysoserial,用于生成利用不安全Java对象反序列化的有效负载的概念验证工具。.zip

    用于生成利用不安全Java对象反序列化的有效负载的概念验证工具。

    Java实现序列化与反序列化的简单示例

    序列化与反序列化是指Java对象与字节序列的相互转换,一般在保存或传输字节序列的时候会用到,下面有两个Java实现序列化与反序列化的简单示例,不过还是先来看看序列和反序列化的具体概念:

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     1.2.6 域对象的持久化概念  1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  ...

    java面试题进阶版附答案.docx

    六、序列化和反序列化:解释了Java中序列化和反序列化的概念,以及通过实现Serializable接口进行对象的序列化和反序列化的过程。 七、内部类和匿名类:介绍了Java中的内部类和匿名类的概念,包括不同类型的内部类...

    ysoserial:概念证明工具,用于生成利用不安全的Java对象反序列化的有效负载

    一种概念证明工具,用于生成利用不安全的Java对象反序列化的有效负载。 描述 最初作为AppSecCali 2015讲座一部分发布,其中包含针对Apache Commons Collections(3.x和4.x),Spring Beans / Core(4.x)和Groovy...

    ysoserial:一种概念验证工具,用于生成利用不安全的Java对象反序列化的有效负载

    约瑟 概念证明工具,用于生成利用不安全的Java对象反序列化的有效负载。描述最初作为AppSecCali 2015讲座一部分发布,其中包含Apache Commons Collections(3.x和4.x),Spring Beans / Core(4.x)和Groovy( 2.3.x...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     1.2.6 域对象的持久化概念  1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     1.2.6 域对象的持久化概念  1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  ...

    Android上的Java对象反序列化-Android开发

    Android Java反序列化漏洞测试仪关于本项目包含旨在测试和创建Andr中Java反序列化漏洞概念验证(PoC)漏洞的工具的Android应用Android Java反序列化漏洞测试仪关于本项目包括旨在作为Android应用程序的Android应用...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     1.2.6 域对象的持久化概念  1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  ...

    JavaEE技术问题汇总.docx

    如何实现Java中的一个对象中某一个属性不被序列化,如何实现呢? Java中堆内存和栈内存区别 讲一讲反射,主要是概念,都在哪需要反射机制 JSP中有个概念,静态包含和动态包含? Strust2和Springmvc的对比...

    Java实例高难度面试题及解析 - 展现你的编程实力!

    此外,我们还探讨了对象的哈希码、重写equals()和hashCode()方法的技巧,以及对象的序列化和反序列化。 通过研究和解答这些高难度问题,您将提升自己的编程水平,展现出对Java实例概念和相关技术的深入理解。无论您...

    Java后端+Java后端中级面试题

    什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中的核心概念和常见问题,帮助您准备面试。祝您面试...

    Java大数据开发+Java大厂面试题

    什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中的核心概念和常见问题,帮助您准备面试。祝您面试...

    Java常见面试题.pdf

    Java常见面试题: 1. 什么是 Java?它的特点是什么? 2. 解释面向对象编程(OOP)的概念和特点。 3. Java 中的基本数据...19. 解释 Java 中的序列化和反序列化的概念。 20. 如何处理并发编程中的线程安全和性能问题?

Global site tag (gtag.js) - Google Analytics