什么是Java序列化,如何实现java序列化

 
 

温馨提示

请拖动到文章末尾,长按识别「抽奖」小程序。现金红包等你来拿。点击文末广告」更有机会获取20元现金大奖。


一、简要解释:


序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。


可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。


序列化是为了解决在对对象流进行读写操作时所引发的问题。


序列化的实现:将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的。


然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream (对象流) 对象。


接着,使用ObjectOutputStream对象的writeObject(Object obj) 方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。


二、详细解释:


当两个进程在进行远程通信时,彼此可以发送各种类型的数据。


无论是何种类型的数据,都会以二进制序列的形式在网络上传送。


发送方需要把这个 Java 对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为 Java 对象。


只能将支持 java.io.Serializable 接口的对象写入流中。


每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。


1.概念


序列化:把 Java 对象转换为字节序列的过程。

反序列化:把字节序列恢复为 Java 对象的过程。


2.用途


对象的序列化主要有两种用途:


1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2) 在网络上传送对象的字节序列;


3.对象序列化


序列化 API


java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj) 方法可对参数指定的 obj 对象进行序列化,把得到的字节序列写到一个目标输出流中。


只有实现了 Serializable Externalizable 接口的类的对象才能被序列化。


java.io.ObjectInputStream 代表对象输入流,它的 readObject() 方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。


代码示例


 
 
import java.io.*;	
import java.util.Date;	
	
public class ObjectSaver {	
    public static void main(String[] args) throws Exception {	
        /*其中的  D:\\objectFile.obj 表示存放序列化对象的文件*/	
	
        	
        //序列化对象	
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj"));	
        Customer customer = new Customer("文淑", 24);    	
        out.writeObject("你好!");    //写入字面值常量	
        out.writeObject(new Date());    //写入匿名Date对象	
        out.writeObject(customer);    //写入customer对象	
        out.close();	
	
        	
        //反序列化对象	
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj"));	
        System.out.println("obj1 " + (String) in.readObject());    //读取字面值常量	
        System.out.println("obj2 " + (Date) in.readObject());    //读取匿名Date对象	
        Customer obj3 = (Customer) in.readObject();    //读取customer对象	
        System.out.println("obj3 " + obj3);	
        in.close();	
    }	
}	
	
class Customer implements Serializable {	
    private String name;	
    private int age;	
    public Customer(String name, int age) {	
        this.name = name;	
        this.age = age;	
    }	
	
    public String toString() {	
        return "name=" + name + ", age=" + age;	
    }	
}


执行结果


 
 
obj1 你好!	
obj2 Sun May 19 23:33:58 CST 2020	
obj3 name=文淑,age=24

 

4.说明


读取对象的顺序与写入时的顺序要一致。


对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。


原文链接


https://www.cnblogs.com/yangchunze/p/6728086.html


注意,装逼时刻到了请「点击文末广告」,不定期将在点击的读者中抽取幸运者,领取 20 元现金红包~


微信扫一扫识别小程序,参与抽奖

640?wx_fmt=png长按识别小程序,参与抽奖

640?wx_fmt=png


更多现金红包,请长按二维码640?wx_fmt=other 640?wx_fmt=png

目前100000+人已关注加入我们

640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif

640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=gif


640?wx_fmt=gif



“广告”赢取超额现金红包!
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值