Java 对象串行化

在前面我们学习了用一些特定的方法可以将int,double等类型的数据进行输入输出处理。现在假设我们有一个Student类,每个Student对象包含了姓名,语文,数学,英语的成绩。姓名是String类型,成绩是int类型,现在想把Student对象的数据保存下来,你会想到什么办法?当然,用前面的办法可以用writeInt等方法输出到文件中,用readInt等方法从文件中读出来,可是如果我们遇到一个不止思想数据的对象呢???

对象串行化就是直接把整个对象做输入输出处理,java提供了一种机制来完成这个工作,它的名字就叫串行化Serialization,简单的说,就是把对象中的属性,按照流的方法来做输入输出处理,这里要注意,只有属性可以做串行化处理,因为属性是变量,可以存储数据,方法是程序代码,做输出输入处理没有意义。

只要一个类实现了Serializable接口,这个类的对象就可以串行化,Serializable接口是个标记接口,标记接口是指没有定义任何的成员,简单地说就是一个空接口,在前面学习对象复制的时候Cloneable接口也是空接口。实现标记接口的类内部不需要做任何改变(接口没有方法让它去实现);

下面我们来写一个可以串行化的类:(这里有个问题,结果在文件里是乱码,不过不影响再从文件获取数据)

package ch21;
 
import java.io.*;
 
//Student类实现了Serializable接口,所以它的对象可以串行化输入输出
public class Studentimplements Serializable
{
    private String name;
    private int chScore, engScore;
    private transient int mathScore;//transient用于修饰希望在串行化过程中不想被串行化的属性
     
    public Student(String n, int c,int e,int m)
    {
        name = n;
        chScore = c;
        engScore = e;
        mathScore = m;
    }
     
    public double avgScore()
    {
        return (chScore+engScore+mathScore)/3.0;
    }
     
    public void printData()
    {
        System.out.println("姓名:"+name);
        System.out.println("语文:"+chScore);
        System.out.println("英文:"+engScore);
        System.out.println("数学:"+mathScore);
        System.out.println("平均:"+avgScore());  
         
    }
}


写一个类来写串行化数据:

package ch21;
 
import java.io.*;
 
public class ObjectSerializationExample1
{
    public static void main(String argv[])
    {
        int c = Integer.parseInt(argv[1]);
        int e = Integer.parseInt(argv[2]);
        int m = Integer.parseInt(argv[3]);
 
        Student st = new Student(argv[0], c, e, m);
        st.printData();
         
        try {
            FileOutputStream fout = new FileOutputStream("C:\\Data.txt");
            ObjectOutputStream objOut = new ObjectOutputStream(fout);//数据流连接机制!!!
         
            objOut.writeObject(st);//写串行化对象
            objOut.close();
            fout.close();
        }
        catch (IOException ie)
        {
            System.err.println(e);
        }
    }
}


读出串行化数据:

package ch21;
 
import java.io.*;
 
public class ObjectSerializationExample2
{
    public static void main(String argv[])
    {
        try {
            FileInputStream fin = new FileInputStream("Data.txt");
            ObjectInputStream objIn = new ObjectInputStream(fin);//数据流连接!!!
 
            Student st = (Student)objIn.readObject();//获取串行化数据
            st.printData();
         
            objIn.close();
            fin.close();
        }
        catch (Exception e)
        {
            System.err.println(e);
        }
    }
}


结果:

姓名:java
语文:90
英文:80
数学:0
平均:56.666666666666664

可以看transient关键字发生了作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值