java序列化与反序列化

java序列化是什么,是怎么实现的,为什么要序列化?
我们知道,无论是保存文本,图片还是视频等资源到硬盘上时,是无法直接将字符串,图片保存到硬盘上的,我们只能将这些资源转化为字节之后才可以保存到硬盘上,也就是数据的持久化。同理从硬盘中读取的数据也是字节,需要将字节转化为我们需要的格式。(字符流读取字符串时,也是在内部将字节转化为字符,字符流只能够读取字符,而字节流几乎可以读取所有资源)
java序列化是将java对象转化为字节,将java对象转化为字节之后,才可以将java对象保存到硬盘上,也就是将java对象持久化。利用序列化实现远程通信,即在网络上传送对象的字节序列。反序列化即将字节序列转化为简单易懂的java对象。
通过writeObject(object)可以将java对象转化为字节序列,并且写入到硬盘上,通过readObject可以将字节序列转化为java对象,并且将其返回。
通过实现Serializable或Externalizable接口,可以将java对象序列化。
使用transient关键字修饰的属性将不会被序列化。

下面是序列化与反序列化的具体例子
下面是Student实体对象

package com.xfl.io;

import java.io.Serializable;

public class Student implements Serializable{
    private String stuno;
    private String stuname;
    //该元素不会进行jvm默认的序列化,也可以自己完成这个元素的序列化
    private transient int stuage;  

    public Student(String stuno, String stuname, int stuage) {
        super();
        this.stuno = stuno;
        this.stuname = stuname;
        this.stuage = stuage;
    }

    public String getStuno() {
        return stuno;
    }
    public void setStuno(String stuno) {
        this.stuno = stuno;
    }
    public String getStuname() {
        return stuname;
    }
    public void setStuname(String stuname) {
        this.stuname = stuname;
    }
    public int getStuage() {
        return stuage;
    }
    public void setStuage(int stuage) {
        this.stuage = stuage;
    }
    @Override
    public String toString() {
        return "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage="
                + stuage + "]";
    }
     private void writeObject(java.io.ObjectOutputStream s)
                throws java.io.IOException{
         s.defaultWriteObject();//把jvm能默认序列化的元素进行序列化操作
         s.writeInt(stuage);//自己完成stuage的序列化
     }
     private void readObject(java.io.ObjectInputStream s)
                throws java.io.IOException, ClassNotFoundException{
          s.defaultReadObject();//把jvm能默认反序列化的元素进行反序列化操作
          this.stuage = s.readInt();//自己完成stuage的反序列化操作
    }
}

将对象序列化与反序列化

package com.xfl.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectSeriaDemo1 {
    public static void main(String[] args) throws Exception{
        String file = "demo/obj.dat";
        //1.对象的序列化
        ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream(file));
        Student stu = new Student("10001", "张三", 20);
        oos.writeObject(stu);
        oos.flush();
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream(file));
        Student stu2 = (Student)ois.readObject();
        System.out.println(stu2);
        ois.close();

    }


}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值