`
robinsoncrusoe
  • 浏览: 746758 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

java序列化java.io.Serializable(转过来的,呵呵)

    博客分类:
  • JAVA
阅读更多
在JAVA中,一个大的应用程序需要保存很多对象的时候,由于虚拟机内存有限,(资源宝贵啊  )有时不可能所有有用的对象都放到内存中,因此,需要将不常用的对象暂时持久化的文件中,当需要这个对象时,再从文件把对象恢复到内存中,这就是所谓对象的序列化和反序列化。本文讲实现如何将对象序列化到文件,然后再从文件反序列化到对象,你会发现其实特别简单



先看一下对象的序列化和反序列化的关键是什么

1,首先被序列化的对象必须实现 java.io.Serializable 接口,咳~~咳~~,其实这个接口没定义任何方法



2,序列化时,需要用到对象输出流ObjectOutputStream ,然后通过文件输出流构造 ObjectOutputStream 对象调用writeObject写入到文件



3,反之,反序列化时用到对象输入流ObjectIntputStream,  然后通过文件输出流构造 ObjectIntputStream对象调用readObject加载到内存,注意,是返回万能Object类型



4,注意:序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列化(关于静态变量不会序列化保留意见,本实例先不用静态变量)



5,也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错



好了,现在我们做一个实例,我们现在要序列化一个会员对象到文件里,然后再把它读出来

先创建会员类

Java代码
import java.io.*;  
import java.util.*;  
 
//一定要实现Serializable接口才能被序列化  
public class UserInfo implements Serializable {  
    public String userName;  
    public String userPass;  
    //注意,userAge变量前面的transient  
    public transient int userAge;  
 
    public UserInfo(){  
    }  
 
    public UserInfo(String username,String userpass,int userage){  
        this.userName=username;  
        this.userPass=userpass;  
        this.userAge=userage;  
    }  
 
    public String toString(){  
        return "用户名: "+this.userName+";密码:"+this.userPass+  
            ";年龄:"+this.userAge;  
    }  


import java.io.*;
import java.util.*;

//一定要实现Serializable接口才能被序列化
public class UserInfo implements Serializable {
public String userName;
public String userPass;
//注意,userAge变量前面的transient
public transient int userAge;

public UserInfo(){
}

public UserInfo(String username,String userpass,int userage){
this.userName=username;
this.userPass=userpass;
this.userAge=userage;
}

public String toString(){
return "用户名: "+this.userName+";密码:"+this.userPass+
";年龄:"+this.userAge;
}
}
接着我们开始写如何序列化和反序列化,初学认真看哦

Java代码
import java.io.*;  
import java.util.*;  
public class Test {  
 
    //序列化对象到文件  
    public static void serialize(String fileName){  
        try 
        {  
            //创建一个对象输出流,讲对象输出到文件  
            ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));  
 
            out.writeObject("序列化日期是:");  //序列化一个字符串到文件  
 
            out.writeObject(new Date());    //序列化一个当前日期对象到文件  
 
            UserInfo user=new UserInfo("renyanwei","888888",20);  
            out.writeObject(user);  //序列化一个会员对象  
 
            out.close();  
        }  
        catch (Exception x)  
        {  
            System.out.println(x.toString());  
        }  
          
    }  
    //从文件反序列化到对象  
    public static void deserialize(String fileName){  
        try 
        {  
            //创建一个对象输入流,从文件读取对象  
            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());  
 
            //读取UserInfo对象并调用它的toString()方法  
            UserInfo user=(UserInfo)(in.readObject());            
            System.out.println(user.toString());  
 
            in.close();  
        }  
        catch (Exception x)  
        {  
            System.out.println(x.toString());  
        }  
          
    }  
 
    public static void main(String[] args) {      
        serialize("D:\\test.txt");  
        System.out.println("序列化完毕");  
 
        deserialize("D:\\test.txt");  
        System.out.println("反序列化完毕");  
    }  
 


import java.io.*;
import java.util.*;
public class Test {

//序列化对象到文件
public static void serialize(String fileName){
try
{
//创建一个对象输出流,讲对象输出到文件
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));

out.writeObject("序列化日期是:"); //序列化一个字符串到文件

out.writeObject(new Date()); //序列化一个当前日期对象到文件

UserInfo user=new UserInfo("renyanwei","888888",20);
out.writeObject(user); //序列化一个会员对象

out.close();
}
catch (Exception x)
{
System.out.println(x.toString());
}

}
//从文件反序列化到对象
public static void deserialize(String fileName){
try
{
//创建一个对象输入流,从文件读取对象
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());

//读取UserInfo对象并调用它的toString()方法
UserInfo user=(UserInfo)(in.readObject());
System.out.println(user.toString());

in.close();
}
catch (Exception x)
{
System.out.println(x.toString());
}

}

public static void main(String[] args) {
serialize("D:\\test.txt");
System.out.println("序列化完毕");

deserialize("D:\\test.txt");
System.out.println("反序列化完毕");
}

}
运行结果:


序列化完毕
今天是:
Thu Oct 23 18:31:11 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕

我们看代码总结一下,serialize方法实现了对象的序列化功能,讲对象序列化到文件,使用了文件的输出流ObjectOutputStream 的writerObject方法一次写入一个对象,对象在文件中按写入顺序存储。

deserialize方法实现反序列化,从文件将对象反序列化到内存,使用了ObjectIntputStream 的readObject方法,因为序列化对象是按照写入顺序存储的,所以在反序列化时必须按照写入顺序读取

大家看了结果就应该知道了,标明transit的实例变量是没被序列化进去的 ,呵呵

分享到:
评论

相关推荐

    java.io.Serializable序列化问题

    ### Java.io.Serializable 序列化问题详解 #### 一、序列化的概念与作用 在 Java 编程语言中,序列化是一种将对象的状态(即成员变量的值)转换为可以存储或传输的形式的过程。通常,这种形式是字节流,但也可以是...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    java序列化(Serializable)的作用和反序列化

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

    java 中序列化NotSerializableException问题解决办法

    NotSerializableException 是 Java 中的一个异常,它发生在尝试序列化一个不implement Serializable 接口的对象时。今天,我们将讨论 Java 中序列化 NotSerializableException 问题的解决办法。 问题描述 --------...

    什么是java序列化,如何实现java序列化?学习.pdf

    Java 序列化机制 Java 序列化机制是一种将对象状态写入 Byte 流里的技术,并可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许将对象通过网络进行传播,并可以随时把对象持久化到...

    Java序列化

    - `java.io.Serializable` 是Java序列化的基础,任何类如果想要实现序列化,就必须实现这个接口。这个接口是一个标记接口,没有定义任何方法,只是表明该类的对象可以被序列化。 3. **序列化流程** - 使用 `java....

    什么是java序列化,如何实现java序列化?借鉴.pdf

    Java 序列化机制 Java 序列化是指将一个对象的状态写入一个 Byte 流里,并且可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到...

    Java序列化(Serializable)与反序列化_.docx

    ### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...

    Java序列化_Java序列化结构_

    Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这个过程被称为序列化,而反向操作称为反序列化。序列化在许多场景下都非常有用,比如在分布式...

    java对象序列化.ppt

    要实现对象序列化,Java类必须实现`Serializable`接口或`Externalizable`接口。`Serializable`接口是一个空接口,当一个类实现它时,表明该类的所有实例都可以被序列化。而`Externalizable`接口提供了更多的控制权,...

    java自动序列化

    Java序列化是将对象转换为字节流的过程,目的是为了保存对象的状态以便稍后恢复或传输到其他地方。通过实现`Serializable`接口,一个Java对象就可以被序列化。这个接口是一个标记接口,没有定义任何方法,仅表示对象...

    Java对象序列化详细解析.doc

    在Java中,对象序列化是通过实现`java.io.Serializable`接口来实现的。 **Serializable接口**: `Serializable`接口是一个标记接口,它没有定义任何方法。当一个类实现了这个接口,就意味着该类的对象可以被序列化...

    Java序列化(Serializable)与反序列化__1.docx

    Java序列化(Serializable)是Java平台提供的一种持久化机制,允许将对象的状态转换为字节流,以便存储到磁盘、数据库中,或者在网络上传输。这一过程被称为对象的序列化。反之,将字节流恢复为原来的对象状态称为反...

    java序列化和反序列化

    ### Java序列化与反序列化详解 #### 一、Java序列化概述 Java序列化(Serialization)是一项重要的功能,它可以将对象的状态转化为一系列字节,从而实现对象的持久化存储或在网络上传输。序列化机制使得Java对象...

    java 常用序列化和反序列化框架使用demo

    Java序列化和反序列化是将对象的状态转换为字节流和从字节流恢复对象状态的过程,这对于数据持久化、网络传输以及跨进程通信等场景至关重要。在Java中,`java.io.Serializable`接口用于标记一个类是可序列化的。然而...

    java中的序列化与反序列化

    Java序列化机制的优点在于它提供了一种标准的方式来处理对象的持久化和在网络间的传输。然而,序列化也存在安全风险,比如序列化可能导致远程代码执行攻击。因此,对于敏感信息或复杂对象结构,应谨慎使用序列化,并...

    java序列化全解

    Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...

    Java 串行化(序列化)Serializable/Externalizable

    在实际项目中,例如在网络通信中传递复杂对象,或者是将对象持久化到数据库或文件,Java序列化都是一种常用的工具。在 serializable-prj 项目中,可能包含了各种示例代码,展示了如何在Java中实现和使用序列化功能。...

    07-Java序列化面试题(10题)-新增.pdf

    Java序列化面试题(10题) 在 Java 中,序列化是一种用于处理对象流的机制,它可以将对象的内容进行流化,使其可以被读写和传输。下面是 10 个与 Java 序列化相关的面试题目: 1. 什么是 Java 序列化,如何实现 ...

    Java序列化的机制和原理

    Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、在网络上传输或者在后续时间重新创建相同对象的机制。这是Java编程中一个非常重要的概念,尤其是在分布式环境和持久化存储中。让我们深入探讨一下Java...

Global site tag (gtag.js) - Google Analytics