首页 > 编程知识 正文

java序列化和反序列化两种方式,java 序列化和反序列化例子

时间:2023-05-04 10:59:51 阅读:229151 作者:1010

一、先来说说什么是序列化和反序列化?

         java对象序列化的意思就是将对象的状态转换成字节流,以后可以通过这些值在生成相同状态的对象,对象序列化就是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输,反序列化就是根据这些保存的信息重建对象的过程。

总之:

      序列化就是将java对象转化为字节序列的过程

      反序列化就是将字节序列转换为java对象的过程

二、那么我们为什么要进行序列化呢?

         当我们两个进程进行远程通信的时候,可以相互发送各种类型的数据,包括文本,图片等,然后这些数据都会以二进制序列的形式在网络上传送,那么两个java进程在通信的时候也可以实现对象的传送,这个时候就需要Java序列化了

        发送方需要把java对象转换为字节序列然后在网络上进行传送,接收方需要从字节序列中恢复出java对象

 

三、那么Java序列化的好处是什么?

好处一:实现了数据的持久化,

好处二:利用序列化实现远程通信,在网络上进行对象的字节序列传送

 

四、涉及到序列化和反序列化的JavaApi java.io.ObjectOutputStream 表示对象输出流,它的writeObject(Object) 方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中java.io.ObjectInputStream 表示对象输入流,它的readObject()方法从输入流中读取字节序列,再把他们反序列化成为一个对象并且返回

只有实现了Serialzable或者Externalizable 接口的类的对象才能被序列化,否则抛出异常

五、现在我们通过代码来说明如何实现序列化和反序列化:

1.先创建一个实体类:

package com.example.entity;/* * Copyright 2013-2020 Smartdot Technologies Co., Ltd. All rights reserved. * SMARTDOT PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */import java.io.Serializable;/** * <p> * * @author <a rel="external nofollow" rel="external nofollow" rel="external nofollow" href="mailto:heyf@smartdot.com.cn">heyf</a> * @version 1.0, 2020-11-21 09:43:22 * @class * @date 2020-11-21 09:43:22 * @see </p> */public class SerialEntity implements Serializable { private String age; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; }}

2.创建一个类用来实现序列化:

package com.example.controller;/* * Copyright 2013-2020 Smartdot Technologies Co., Ltd. All rights reserved. * SMARTDOT PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */import com.example.entity.SerialEntity;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;/** * 序列化 * <p> * * @class ObjSerializeAndDeserializeTest * @date 2020-11-21 09:39:29 * @author <a rel="external nofollow" rel="external nofollow" rel="external nofollow" href="mailto:heyf@smartdot.com.cn">heyf</a> * @version 1.0, 2020-11-21 09:39:29 * @see </p> */public class ObjSerializeAndDeserializeTest { public static void main(String[] args) { SerializePerson(); } /* * @Author HYF * @Description //TODO验证序列化id存在的意义 * @Date 9:41 2020/11/21 * @Param [] * @return void **/ public static void SerializePerson(){ Logger logger = LoggerFactory.getLogger(ObjSerializeAndDeserializeTest.class); SerialEntity serialEntity=new SerialEntity(); serialEntity.setAge("30"); //创建一个输出流 ObjectOutputStream outputStream=null; try{ outputStream=new ObjectOutputStream(new FileOutputStream("D:\1.实习\-quartz-demo\static\test.txt")); // outputStream.writeObject(serialEntity); logger.info(serialEntity.toString()); logger.info("序列化成功"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try{ //关闭输出流 outputStream.close(); }catch(IOException e){ e.printStackTrace(); } } }}

运行结果:


文件内容: 不要直接用txt记事本打开要用文本编辑器打开会乱码,我没有,所有大家凑合看吧

 

3、反序列化代码: 从文件中读取内容并且打印出来

package com.example.controller;/* * Copyright 2013-2020 Smartdot Technologies Co., Ltd. All rights reserved. * SMARTDOT PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */import com.example.entity.SerialEntity;import org.apache.ibatis.javassist.util.proxy.ProxyObjectInputStream;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.ObjectInputStream;/** * 反序列化,从文件中读取内容并且打印出来 * <p> * * @author <a rel="external nofollow" rel="external nofollow" rel="external nofollow" href="mailto:heyf@smartdot.com.cn">heyf</a> * @version 1.0, * @class * @date * @see </p> */public class ObjSerializeAndDeserializeTest2 { public static void main(String[] args) { Logger logger= LoggerFactory.getLogger(ObjSerializeAndDeserializeTest2.class); SerialEntity serialEntity=DeserializePersion(); logger.info(serialEntity.getAge()); logger.info(serialEntity.getName()); } private static SerialEntity DeserializePersion(){ SerialEntity person = null; ObjectInputStream inputStream = null; try { inputStream = new ObjectInputStream(new FileInputStream("D:\1.实习\-quartz-demo\static\test.txt")); try { person = (SerialEntity) inputStream.readObject(); System.out.println("执行反序列化过程成功。"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return person;}}

 

以上就是我们序列化和反序列化的过程。 

但是如果正规来说我们的实体中缺少了一个显示定义的serialVersionUID,什么是serialVersionUID? 这个东西有什么作用?好处是什么?

敬请关注下一遍博客。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。