对J2SE中的序列化的一个感性的认识

java中处处体现着简单的程序设计风格,序列化作为最常用的功能之一,在java中的设计尤为“简单”。在ObjectInputStream 和ObjectOutputStream的帮助下,我们可以轻松的实现序列化。

只要我们的class 实现了java.io.Serializable接口,就可以利用ObjectOutputStream的writeObject()方法将一个对象序列化;利用ObjectInputStream的readObject()方法,可以返回读出的object对象。Serializable接口不需要我们实现任何方法。

以下是一个例子,它能给我们一个感性的认识:

Serial实现了就java.io.Serializable接口,是需要序列化的类。我们首先构造一个Serial的对象serial1然后将其保存(序列化)在一个文件中,而后再将其读出(反序列化),并打印其内容。

package Stream;
/**
* @author favo yang
*/
import java.io.*;
public class Serial implements Serializable {
 int company_id;
 String company_addr;
 boolean company_flag;
 public Serial(){}//不同于c++,没有也可以
 public Serial(int company_id,String company_addr,boolean company_flag) {
  this.company_id=company_id;
  this.company_addr=company_addr;
  this.company_flag=company_flag;
 }
 public static void main(String[] args) {
  Serial serial1 = new Serial(752,"dayer street #5 building 02-287",false);//构造一个新的对象
  FileInputStream in=null;
  FileOutputStream out=null;
  ObjectInputStream oin=null;
  ObjectOutputStream oout=null;
  try {
   out = new FileOutputStream("5.txt");
   oout = new ObjectOutputStream(out);
   serial1.serialize(oout);//序列化
   oout.close();
   oout=null;
   in = new FileInputStream("5.txt");
   oin = new ObjectInputStream(in);
   Serial serial2 = Serial.deserialize(oin);//反序列化
   System.out.println(serial2);//打印结果
  } catch (Exception ex){
   ex.printStackTrace();
  } finally{
   try {
    if (in != null) {
     in.close();
    }
    if (oin != null) {
     oin.close();
    }
    if (out != null) {
     out.close();
    }
    if (oout != null) {
     oout.close();
    }
   } catch (IOException ex1) {
    ex1.printStackTrace();
   }
  }
 }
 /**
 * deserialize
 */
 public static Serial deserialize(ObjectInputStream oin) throws Exception{
  Serial s=(Serial)oin.readObject();
  return s;
 }
 public String toString() {
  return "DATA: "+company_id+" "+company_addr+" "+company_flag;
 }
 /**
  * serialize
 */
 public void serialize(ObjectOutputStream oout) throws Exception{
  oout.writeObject(this);
 }
}

运行结果:

DATA: 752 dayer street #5 building 02-287 false

正确打印了结果。

时间: 2016-01-22

对J2SE中的序列化的一个感性的认识的相关文章

J2SE中的序列化的认识_JSP编程

java中处处体现着简单的程序设计风格,序列化作为最常用的功能之一,在java中的设计尤为"简单".在ObjectInputStream 和ObjectOutputStream的帮助下,我们可以轻松的实现序列化. 只要我们的class 实现了java.io.Serializable接口,就可以利用ObjectOutputStream的writeObject()方法将一个对象序列化:利用ObjectInputStream的readObject()方法,可以返回读出的object对象.Se

谈谈J2SE中的序列化之当序列化遭遇继承

j2se|继承 运行结果证明了这种方法是正确的.在此处我们用到了writeObject/ readObject方法,这对方法如果存在的话,序列化时就会被调用,以代替默认的行为(以后还要探讨,先了解这么多).我们在序列化时,首先调用了ObjectOutputStream的defaultWriteObject,它使用默认的序列化行为,然后序列化父类的域:反序列化的时候也一样. 归纳一下: 目的 行为 为一个实现Serializable接口的父类,编写一个能够序列化的子类 子类将自动的实现序列化 为一

J2SE中的序列化之继承_JSP编程

当一个父类实现Serializable接口后,他的子类都将自动的实现序列化. 以下验证了这一点: package Serial; import java.io.Serializable; public class SuperC implements Serializable {//父类实现了序列化 int supervalue; public SuperC(int supervalue) { this.supervalue = supervalue; } public String toStri

谈谈J2SE中的序列化(三)

何时接受默认的java序列化行为首先要了解java默认的序列化行为,java将一切关于对象的信息都保存了下了,也就是说,有些时候那些不需要保存的也被保存了下来.一般情况下,我们仅仅需要保存逻辑数据就可以了.不需要保存的数据我们可以用关键字transient标出.以下是一个例子:import java.io.*;public class Serial implements Serializable { int company_id; String company_addr; transient b

谈谈J2SE中的序列化(二)

当序列化遇到继承-当一个父类实现Serializable接口后,他的子类都将自动的实现序列化.以下验证了这一点:package Serial;import java.io.Serializable;public class SuperC implements Serializable {//父类实现了序列化 int supervalue; public SuperC(int supervalue) { this.supervalue = supervalue; } public String t

详解Python中的序列化与反序列化的使用

  这篇文章主要介绍了详解Python中的序列化与反序列化的使用,针对pickle和cPickle对象进行了探究,需要的朋友可以参考下 学习过marshal模块用于序列化和反序列化,但marshal的功能比较薄弱,只支持部分内置数据类型的序列化/反序列化,对于用户自定义的类型就无能为力,同时marshal不支持自引用(递归引用)的对象的序列化.所以直接使用marshal来序列化/反序列化可能不是很方便.还好,python标准库提供了功能更加强大且更加安全的pickle和cPickle模块. cP

浅析Python中的序列化存储的方法

  这篇文章主要介绍了Python中的序列化存储的方法,序列化存储主要针对的是内存和硬盘之间的写入操作,需要的朋友可以参考下 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: ? 1 d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收.如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'. 我们把变量从内存中变

Silverlight中的序列化

序列化简言之是这样一种能力:能够把复杂的对象(Object)变成某种格式的字符串(常见的格式有xml,string,二进制文件等),这样可以方便的在各种系统中传输或交换(比喻socket编程中的数据包只能用byte[]传输),接收方得到该字符串后,通过反序列化可以还原为复杂对象,进而调用对象的方法或属性 -- 跟反射有点沾边:) 这里先给出一个WinForm的序列化例子,功能为通过打开文件对话框选择一个文件后,构造一个复杂对象,然后序列化为二进制格式,得到该格式后,再反序列化(还原)为复杂对象

java-求助,Java中对象序列化的作用是什么?

问题描述 求助,Java中对象序列化的作用是什么? Java中对象序列化的作用是什么?求大神相助,希望能全面一点哦.急求大神解答 解决方案 简单来说,对象像一颗树,里面有字段,如果字段是类型,那么它还有自己的字段. 但是网络传输.保存文件,都必须是线性的,连续的. 序列化就是把这棵树拍扁,成为一个序列的过程. 反序列化就是从一个序列中重新把这颗树拉回来的过程. 解决方案二: 把一个对象,转成流数据,对方根据这个数据还原成初始对象,适用于不同对象间的传输,通讯 解决方案三: 序列化多用于网络IO通