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
相关文章
|
11天前
|
存储 Java
java的对象详解
在Java中,对象是根据类模板实例化的内存实体,具有唯一标识符、属性及行为。通过`new`关键字实例化对象并用构造方法初始化。变量存储的是对象引用而非对象本身,属性描述对象状态,方法定义其行为。Java利用垃圾回收机制自动处理不再使用的对象内存回收,极大地简化了对象生命周期管理,同时对象具备封装、继承和多态性,促进了代码的重用与模块化设计。这使得Java程序更易于理解、维护和扩展。
|
7天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
20 9
Java——类与对象(继承和多态)
|
7天前
|
SQL Java 编译器
Java——类与对象(封装)
封装是面向对象编程中的概念,指将数据(属性)和相关操作(方法)组合成独立单元(类),使外部无法直接访问对象的内部状态,只能通过提供的方法进行交互,从而保护数据安全。例如,手机将各种组件封装起来,只暴露必要的接口供外部使用。实现封装时,使用`private`关键字修饰成员变量,并提供`get`和`set`方法进行访问和修改。此外,介绍了包的概念、导入包的方式及其注意事项,以及`static`关键字的使用,包括静态变量和方法的初始化与代码块的加载顺序。
18 10
Java——类与对象(封装)
|
7天前
|
Java C语言
Java——类与对象
这段内容介绍了Java中的类和对象、`this`关键字及构造方法的基本概念。类是对现实世界事物的抽象描述,包含属性和方法;对象是类的实例,通过`new`关键字创建。`this`关键字用于区分成员变量和局部变量,构造方法用于初始化对象。此外,还介绍了标准JavaBean的要求和生成方法。
18 9
Java——类与对象
|
8天前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
|
2天前
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
39 4
|
2天前
|
SQL Java 关系型数据库
在Java中,创建数据源对象
在Java中,创建数据源对象
9 1
|
8天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第12天】在Java的世界里,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何通过实现Serializable接口来标记一个类的对象可以被序列化,并探索ObjectOutputStream和ObjectInputStream类的使用,以实现对象的写入和读取。我们还将讨论序列化过程中可能遇到的问题及其解决方案,确保你能够高效、安全地处理对象序列化。
|
10天前
|
Java 程序员
Java编程中的对象和类: 初学者指南
【9月更文挑战第9天】在Java的世界中,对象和类构成了编程的基石。本文将引导你理解这两个概念的本质,并展示如何通过它们来构建你的程序。我们将一起探索类的定义,对象的创建,以及它们如何互动。准备好了吗?让我们开始这段Java的旅程吧!
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。