`

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

阅读更多
在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-Hadoop序列化

     Java序列化(java.io.Serializable)  Hadoop序列化的特点  Hadoop的序列化格式:Writable  序列化格式特点:  紧凑:高效使用存储空间。  快速:读写数据的额外开销小  可扩展:可透明地读取老格式...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ObjectOutputStream ObjectInputStream Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第7页。...

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

    主要介绍了java 中序列化NotSerializableException问题解决办法的相关资料,这里对序列化问题进行描述说明,并提供解决办法,希望能帮助到大家,需要的朋友可以参考下

    深入分析Java的序列化与反序列化

    本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题:  怎么实现Java的序列化  为什么实现了java.io.Serializable接口才能被序列化  transient的作用是什么  怎么自定义序列...

    java中的IO操作总结(四)

    Serializable序列化 实例1:对象的序列化 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 import java.io....

    Java序列化与反序列化三种格式存取

     一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可(还要实现无参数的构造方法)。该接口是一个标记式接口,它本身不包含任何内容,实现了该接口则表示这个类准备支持序列化的功能。...

    java序列化和反序列化,面试必备

    最近阅读Serializable接口和Externalizable接口的源码,并结合了一些资料,对面试过程中与序列化相关的内容做了一些总结。 一、序列化、反序列化、使用场景、意义。 序列化:将对象写入IO流中; 反序列化:从IO流中...

    Android 通过Intent使用Bundle传递对象详细介绍

    被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA基础,常见java基础问题.rar

    2.接口和抽象类有什么区别 接口不能有方法实现,也就是说接口的方法都是抽象方法,但抽象类可以有方法实现。...序列化的实现一般是通过实现Serializable接口,并且会有一个serialVersionUID,这个ID叫做序列化ID

    netty-JBoss-Marshalling:使用JBoss-marshalling编码包进行java的序列号编码

    netty-JBoss-Marshalling 使用JBoss-marshalling编码包进行java的序列号编码 ...无须实现java.io.Serializable接口,即可实现Java序列化; 通过缓存技术提升对象的序列化性能。 JBoss Marshalling更多是在JBoss内部使

    7.7初始mybatis个人笔记.docx

    java.io.NotSerializableException: ...在mybatis中使用二级缓存时候就必须需要将实体类序列化implements Serializable,我的mapper文件使用了标签,使用了mybatis提供的二级缓存,所以在我的实体类里面必须序列化

    java面试考题

    接口:Connection、Map、List、Set、Comparable(集合比较)、Serializable(序列化)。 包:java.util、java.lang、java.io、java.sql、javax.net、 java.awt、javax.xml 、javax.sevlet。 1.面向对象的特征有哪些? 1...

    ArgsDemo代码

    对于一些对象的传递,我们则需要把被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable

    J2SE中的序列化的认识

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

    在Android中通过Intent使用Bundle传递对象的使用方法

    被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在...

    解析json类混淆,导致错误

    1.proguard中需要加入泛型支持 2.需要序列化的class 的get,set方法名不能混淆 3.第三方应用类库的jar包不要参与混淆 另外,所有需要序列化的model类一定要实现 java.io.Serializable

    J2SE中的序列化之继承

    import java.io.Serializable; public class SuperC implements Serializable {//父类实现了序列化 int supervalue; public SuperC(int supervalue) { this.supervalue = supervalue; } public String toString() {...

    整理后java开发全套达内学习笔记(含练习)

    序列化,串行化 ['siәriәlaiz]'(serializable adj.)(deserialize反序列化,反串行化) Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,...

Global site tag (gtag.js) - Google Analytics