当前位置:编程学习 > JAVA >>

java 序列化

可序列化和反序列化是什么意思?都有什么用,详细说明
答案:不知道怎么说。。。

直接网上找的:

1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

2、什么情况下需要序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;

 

下面再给个jdk宝典里的例子吧,这样你就应该知道怎么用了:

package book.io;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
/**
 * 序列化和反序列化对象
 */
public class SerializeObject {
 // 一个内部类,用于被序列化和反序列化。
 //一定要实现Serializable才能够被序列化和反序列化。
 static class MyClass implements Serializable{
  //一般的实例变量会被序列化和反序列化
     private int a,b;
     //transient实例变量 不会 被序列化和反序列化
     private transient int c;
     // 类变量 不会 被序列化和反序列化
     private static int d;
     public MyClass(){
     }
     public MyClass(int a, int b, int c, int d){
         this.a = a;
         this.b = b;
         this.c = c;
         MyClass.d = d;
     }
     public String toString(){
      return this.a + "  " + this.b + "  " + this.c + "  " + MyClass.d;
     }
 }

 /**
  * 序列化对象到文件
  */
    public static void serialize(String fileName) throws Exception{
     //创建一个对象输出流,将对象输出到文件
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));
        //序列化一个字符串对象到文件
        out.writeObject("Today:");
        //序列化当前日期对象到文件
        out.writeObject(new Date());
        //序列化一个MyClass对象
        MyClass my1 = new MyClass(5, 6, 7, 8);
        out.writeObject(my1);
        out.close();
    }
    /**
     * 从文件反序列化到对象
     */
    public static void deserialize(String fileName) throws Exception{
     //创建一个对象输入流,从文件读取对象
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
        //注意读对象时必须按照序列化对象时的顺序读,否则会出错
        //读取字符串对象
        String today = (String)(in.readObject());
        System.out.println(today);
        //读日期对象
        Date date = (Date)(in.readObject());
        System.out.println(date.toString());
        //读MyClass对象,并调用它的add方法。
        MyClass my1 = (MyClass)(in.readObject());
        System.out.println(my1.toString());
        in.close();
        //当恢复对象的时候,对象中的所有域被自动的恢复。如果不希望某个域被序列化,可以在它前面
        //加上transient关键字,例如下面的代码:transient int noSer = 0;
        //类似的,如果类中的某个域为静态,它不会被序列化。
    }
 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  String fileName = "c:/temp/MyClass.ser";
  SerializeObject.serialize(fileName);
  //注释掉第二行,只运行下面一行,将会发现输出不同
  SerializeObject.deserialize(fileName);
 }
}

 

首先解释两个概念,何为序列化?何为反序列化?

序列化:将对象转化成流的过程称为序列化

反序列化:将流转化成对象的过程称之为反序列化

序列化与反序列化必须遵守的原则

a)         Java对象

在java中要想使一个java对象可以实现序列化与反序列化,必须让该类实现java.io.Serializable接口

java.io.Serializable接口定义如下:

publicinte易做图ce Serializable {

}

从上述定义中可以看到该接口中未定义任何方法,这大大的简化了开发者

b)      序列化主要依赖java.io.ObjectOutputStream类,该类对java.io.FileOutputStream进一步做了封装,这里主要使用ObjectOutputStream类的writeObject()方法实现序列化功能

Demo:

/**

     *将对象序列化到磁盘文件中

     *@paramo

     *@throwsException

     */

    publicstaticvoid writeObject(Object o) throws Exception{

       File f=new File("d:""user.tmp");

       if(f.exists()){

           f.delete();

       }

       FileOutputStream os=new FileOutputStream(f);

       //ObjectOutputStream 核心类

       ObjectOutputStream oos=new ObjectOutputStream(os);

       oos.writeObject(o);

       oos.close();

       os.close();

    }

c)      反序列化主要依赖java.io.ObjectInputStream类,该类对java.io.InputStream进一步做了封装,这里主要使用ObjectInputStream类的readObject()方法实现序列化功能

Demo:

/**

     *反序列化,将磁盘文件转化为对象

     *@paramf

     *@return

     *@throwsException

     */

    publicstatic User readObject(File f) throws Exception{

       InputStream is=new FileInputStream(f);

   &nb

上一个:JAVA什么?
下一个:java改错

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,