首页 > 编程语言 >java.io.Serializable(序列化)接口

java.io.Serializable(序列化)接口

时间:2023-04-13 16:55:45浏览次数:51  
标签:java 对象 public Java io new 序列化 Serializable

 

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

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

反序列化:将字节序列转化为Java对象的过程。

二、为什么要序列化和反序列化
我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?

这就需要Java序列化与反序列化了。换句话说,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象。

当我们明晰了为什么需要Java序列化和反序列化后,我们很自然地会想Java序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

三、涉及到的javaAPI 

  • java.io.ObjectOutputStream:表示对象输出流,它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
  • java.io.ObjectInputStream:表示对象输入流,它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

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

四、序列化和反序列化的步骤

序列化:

步骤一:创建一个对象输出流,它可以包装一个其它类型的目标输出流,如文件输出流:

 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(“目标地址路径”));

步骤二:通过对象输出流的writeObject()方法写对象:

out.writeObject("Hello");
 
out.writeObject(new Date());

 反序列化:        

步骤一:创建一个对象输入流,它可以包装一个其它类型输入流,如文件输入流:

 ObjectInputStream in = new ObjectInputStream(new fileInputStream(“目标地址路径”));

 步骤二:通过对象输出流的readObject()方法读取对象:

String obj1 = (String)in.readObject();
 
Date obj2 =  (Date)in.readObject();

   说明:为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。

五、举个例子

  我们首先写个Person实现Serializable接口:

public class Person implements Serializable {
    //序列化ID
    private static final long serialVersionUID = -5809782578272943999L;
 
    private int id;
    private String name;
    private int age;
 
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

  序列化代码

    @Test
    public void test5(){
        Person person = new Person();
        person.setAge(12);
        person.setId(1);
        person.setName("小明");
 
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("d:/io/data.txt"));
            oos.writeObject(person);
            System.out.println("序列化成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
    }

代码很简单,首先创建一个对象输出流ObjectOutputStream,它可以包装一个其它类型的目标输出流,如文件输出流FileOutputStream,并指定存储的位置为“d:/io/data.txt”,然后通过对象输出流的writeObject()方法写对象便执行了序列化过程。运行看一下效果,正确的话便会在控制台打印“”,并且在本地E盘下会创建一个data.txt文件。

反序列化代码

    @Test
    public void test6(){
        Person person = null;
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("d:/io/data.txt"));
            person = (Person) ois.readObject();
            System.out.println(person);
            System.out.println("反序列化成功");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if(ois != null){
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

执行反序列化的代码也是很简单的,首先创建一个输入流对象ObjectInputStream,然后从指定的目录下“d:/io/data.txt”获取它的字节序列,然后通过输入流对象的readObject()方法将其获得的对象强制转化为Person对象,这就完成了反序列化工作,正确的反序列化成功的情况下控制台打印输出为:

 

 

 

原文链接:https://blog.csdn.net/qq_51409098/article/details/126412452

 

标签:java,对象,public,Java,io,new,序列化,Serializable
From: https://www.cnblogs.com/yzx-sir/p/17315407.html

相关文章

  • Java常用实体类介绍:POJO、Domain、DO、DTO、VO
    POJOPOJO是PlainOldJavaObject的简称,它指的是一个没有限制或要求下的纯平对象。POJO用于表示没有任何框架或技术限制的纯数据对象。在Java开发中,POJO通常用于简化复杂对象和降低对象的耦合度,是面向对象编程中"高内聚、低耦合"设计思想的体现。示例代码:@Datapublic......
  • JavaScript黑科技:变量监听
    作者:JShaman团队,转载请保留功能目标实时监视一个变量的值,当值发生改变时,马上给出提示。实现方法一直观且朴素的方法,可以用setInterval,循环检测变量的值,示例代码:<html><body><script>//要监视的变量vartest_value=1;setInterval(function(){......
  • C# Json序列化,设置驼峰命名(字段首字母小写)
    相关代码:varserializerSettings=newJsonSerializerSettings{//设置为驼峰命名ContractResolver=newCamelCasePropertyNamesContractResolver()};varresult=JsonConvert.Ser......
  • java故障处理(三)远程debug
    转载:https://blog.51cto.com/u_11554106/4930697一、remotedebug何为远程debug呢?通常我们在开发过程中,都会将代码部署到服务中,这个时候QA提出了一个bug,通过查看代码的逻辑发现问题十分的困难?一般情况下都是想着本地能不能复现一下,本地debug调试一下;或者通过arthas进行相关......
  • Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not fi
    用idea使用mybatis时<mappers><mapperresource="com/mybatis/mapper/UserMapper.xml"></mapper></mappers>遇到吐下错误时ErrorparsingSQLMapperConfiguration.Cause:java.io.IOException:Couldnotfindresourcecom/my......
  • java故障处理(二)可视化工具
    一、JConsole:Java监视与管理控制台命令行:jconsoleJConsole是一款基于JMX的可视化监视、管理工具。它的主要功能是通过JMX的MBean(ManagedBean)对系统进行信息收集和参数动态调整。JMX是一种开放性的技术,不仅可以用在虚拟机本身的管理上,还可以运行于虚拟机之上的软件中,......
  • Java里的数据类型都有哪些
    相关面试题我们从学习Java开始,很快就会遇到Java中的数据类型这个问题。关于数据类型,对于初学者来说,很容易记混,因为Java中的数据类型划分的有点多。所以在招聘初级程序员时,面试官就会经常在这一块出一些题目,对求职者进行基础语法方面的考核。常见的数据类型相关的面试题如下:请说一......
  • java故障处理(一)基础命令行工具
     一、基础命令行工具1.jps:虚拟机进程状况工具可以列出本机正在运行的虚拟机进程,并显示主类1.1.选项:选项作用-q省略主类,只显示id-l显示主类全名,或jar包路径-m显示传递给主类main方法的参数-v输出jvm启动时所有参数2.jstat:虚拟机统计信息监控用于监......
  • JAVA返回前端时候bean转json时首字母、第二个字母大写会自动变成小写的问题
      后台bean是privateStringuName;但是前端生成的json是uname会自动变成小写 如果我们只是个别的几个的话,只需要加个注解@JsonProperty("uName")privateStringuName; 这样就可以了......
  • 如何实现 Java SpringBoot 自动验证入参数据的有效性
    JavaSpringBoot通过javax.validation.constraints下的注解,实现入参数据自动验证如果碰到@NotEmpty否则不生效,注意看下@RequestBody前面是否加上了@ValidValidation常用注解汇总Constraint详细信息@Null被注释的元素必须为null@NotNull被注释的元素必须不......