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
本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/968689如需转载请自行联系原作者

woshixuye111
相关文章
|
3天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
10天前
|
存储 Java
Java编程中的对象序列化与反序列化
【8月更文挑战第28天】在Java世界中,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将深入浅出地探讨这一过程,带你领略其背后的原理及应用,让你的程序在数据的海洋中自由航行。
|
11天前
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。
|
4天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第2天】在Java的世界里,对象序列化和反序列化就像是给数据穿上了一件隐形的斗篷。它们让数据能够轻松地穿梭于不同的系统之间,无论是跨越网络还是存储在磁盘上。本文将揭开这层神秘的面纱,带你领略序列化和反序列化的魔法,并展示如何通过代码示例来施展这一魔法。
8 0
|
7天前
|
存储 Java
Java编程中的对象和类
在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章【8月更文挑战第31天】 将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
|
7天前
|
开发者 Java Spring
【绝技揭秘】掌握Vaadin数据绑定:一键同步Java对象,告别手动数据烦恼,轻松玩转Web应用开发!
【8月更文挑战第31天】Vaadin不仅是一个功能丰富的Java Web应用框架,还提供了强大的数据绑定机制,使开发者能轻松连接UI组件与后端Java对象,简化Web应用开发流程。本文通过创建一个简单的用户信息表单示例,详细介绍了如何使用Vaadin的`Binder`类实现数据绑定,包括字段与模型属性的双向绑定及数据验证。通过这个示例,开发者可以更专注于业务逻辑而非繁琐的数据同步工作,提高开发效率和应用可维护性。
21 0
|
11天前
|
存储 安全 Java
如何理解java的泛型这个概念
理解java的泛型这个概念
|
15天前
|
存储 Java 编译器
|
15天前
|
存储 Java 编译器
如何在 Java 中初始化对象 Arraylist?
【8月更文挑战第23天】
32 0
|
4天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
26 6
【Java学习】多线程&JUC万字超详解
下一篇
DDNS