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

 

目录
相关文章
|
存储 XML JSON
Java对象的序列化和反序列化
Java 对象的序列化和反序列化是一种将对象转换成字节流并存储在硬盘或网络中,以及从字节流中重新加载对象的操作。Java 的序列化和反序列化提供了一种方便的方式,使得可以将对象在不同的应用程序之间进行交互。
126 0
|
网络协议 Java 数据库
序列化系列(1)java序列化技术
这篇文章开始讲java对象的序列化,这是因为近期自己的项目当中,大量使用了序列化技术,这里面有java提供的序列化技术,也有一些序列化框架;所以,下定决心把java的序列化技术整理一下,以供参考。这是序列化系列的第一篇文章,所以主要是描述java提供的序列化技术。后续系列再分别讲使用框架实现序列化。 按照惯例,先给出这篇文章的大致脉络 首先,描述了序列化技术的使用场景和序列化的几种方案。 接着,讲java提供的序列化技术 然后,就是需要注意的几个问题,比如transient关键字、序列化ID的作用、深度克隆等等 最后,对java提供的系列化技术的一个总结
103 0
序列化系列(1)java序列化技术
java对象的序列化与反序列化
序列化与反序列化 原理 对象的序列化流与反序列化流(ObjectOutputStream,ObjectInputStream)及transient关键字 import java.io.FileOutputStream; import java.io.IOException; import java.
|
算法 Java 容器
Java对象的序列化/反序列化原理及源码解析(中)
Java对象的序列化/反序列化原理及源码解析(中)
179 0
Java对象的序列化/反序列化原理及源码解析(中)
|
存储 安全 Java
Java对象的序列化/反序列化原理及源码解析(下)
Java对象的序列化/反序列化原理及源码解析(下)
129 0
|
Java API 容器
Java对象的序列化/反序列化原理及源码解析(上)
Java对象的序列化/反序列化原理及源码解析(上)
319 0
Java对象的序列化/反序列化原理及源码解析(上)
一个Java对象实例序列化和反序列化的例子
一个Java对象实例序列化和反序列化的例子
134 0
|
存储 缓存 Java
Java对象的序列化和反序列化源码阅读
前言 序列化和反序列化看起来用的不多,但用起来就很关键,因为稍一不注意就会出现问题。序列化的应用场景在哪里?当然是数据存储和传输。比如缓存,需要将对象复刻到硬盘存储,即使断电也可以重新反序列化恢复。下面简单理解序列化的用法以及注意事项。
1128 0
|
Java 安全 应用服务中间件