首页 > 其他分享 >对象序列化和反向序列化

对象序列化和反向序列化

时间:2024-08-06 11:09:29浏览次数:9  
标签:Java 对象 反向 new ObjectOutputStream 序列化

对象序列化和反向序列化

目录

在Java中,对象序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。序列化的对象可以被写入到文件、数据库或通过网络传输。反向序列化,也称为反序列化,是序列化过程的逆过程,即将序列化后的数据恢复为Java对象。

要使Java对象能够被序列化,对象的类需要实现 java.io.Serializable 接口。这个接口是一个标记接口,不包含任何方法,但它会指示Java虚拟机这个类的对象是可序列化的。

对象序列化:

  1. 实现 Serializable 接口
    类通过实现 Serializable 接口来声明它可以被序列化。

  2. 使用 ObjectOutputStream 进行序列化
    创建 ObjectOutputStream 的实例,并将需要序列化的对象写入流中。

  3. 示例代码

    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    
    public class SerializationExample {
        public static void main(String[] args) {
            MyObject obj = new MyObject("Kimi", 123);
    
            try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myobject.dat"))) {
                oos.writeObject(obj);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

对象反向序列化:

  1. 使用 ObjectInputStream 进行反向序列化
    创建 ObjectInputStream 的实例,从存储介质中读取数据,并将其转换回Java对象。

  2. 处理 ClassNotFoundException
    如果序列化的对象中包含了其他对象的引用,反序列化时需要确保这些类在运行时环境中可用,否则会抛出 ClassNotFoundException

  3. 示例代码

    import java.io.FileInputStream;
    import java.io.ObjectInputStream;
    
    public class DeserializationExample {
        public static void main(String[] args) {
            try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myobject.dat"))) {
                MyObject obj = (MyObject) ois.readObject();
                System.out.println("Object deserialized: " + obj);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

注意事项:

  • 只有实现了 Serializable 接口的类的对象才能被序列化。
  • 静态字段不会被序列化,因为它们不属于对象的状态。
  • 序列化过程中,如果对象中包含对其他对象的引用,这些对象也必须是可序列化的,否则会导致 NotSerializableException
  • 反序列化创建的对象与原始对象不是同一个实例,它们是两个不同的对象,即使它们的字段值相同。
  • 序列化和反序列化过程中可能会抛出 IOExceptionClassNotFoundException,需要妥善处理这些异常。

序列化和反序列化是Java中处理对象持久性和网络传输的重要机制。通过这种方式,对象的状态可以在不同的运行时环境中保存和恢复。

标签:Java,对象,反向,new,ObjectOutputStream,序列化
From: https://www.cnblogs.com/luoyiwen123/p/18344741

相关文章

  • Element-plus UI框架获取表格中某一行的对象数据
    在Vue3中,#default="scope"是用于指定一个具名插槽(namedslot)的默认插槽,并且向该插槽传递作用域属性(scopedprops)。这个语法是在Vue3的模板编译器中引入的,它取代了Vue2中使用的slot-scope。使用Element-plusUI框架获取表格中某一行的数据,如下面的示例代码:<template>......
  • 对象序列化与反序列化
    对象序列化与反序列化在Java中,对象序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。反序列化则是将这些信息恢复为对象的过程。Java通过实现java.io.Serializable接口来支持对象的序列化和反序列化。以下是对象序列化和反序列化的基本概念和步骤:1.使类实现S......
  • MyBatis 根据数据表反向生成 java 实体类等
    MyBatis根据数据表反向生成java实体类等  1、MyBatis根据已有的数据表生成对应的Java实体类的配置文件:mybatisReverseGeneratorConfig.xml此文件放到项目的根目录下 1<?xmlversion="1.0"encoding="UTF-8"?>2<!DOCTYPEgeneratorConfiguration......
  • 面向对象--方法
    目录1.方法的好处2.方法的定义和调用3.方法之间的关系4.方法里面的参数5.注意6.方法重载7.方法的局部变量1.方法的好处简化代码,提高代码复用性,一次编写多次调用2.方法的定义和调用一段具有独立功能的代码块,需要先定义才能调用方法定义格式:publicstaticvoidmain方法名(){......
  • Java之类和对象
    目录static关键字1修饰属性2修饰方法 final构造方法基本语法this关键字代码块定义普通代码块 构造代码块静态代码块匿名对象toString 总结static关键字1修饰属性Java的静态属性和类相关,和具体的实例无关.换句话说,同一个类的不同实例共用同一个静......
  • 权限,锁定解锁用户接口,发送短信接口,drf部分源码分析APIView源码,新的Request对象,序
    Ⅰ权限【一】ACL(AccessControlList,访问控制列表)#ACL(AccessControlList,访问控制列表) 将用户直接与与权限对接permission表iduser_id权限名11开直播21评论【二】RBAC(Role-BasedAccessControl,基......
  • 深度学习与图像识别(误差反向传播)
    误差反向传播法一 一个高效计算权重以及偏置量的梯度方法ReLU反向传播实现classRelu:def_init_(self):self.x=Nonedefforward(self,x):self.x=np.maximum(0,x)out=self.xreturnoutdefbackward(self,dout):dx=doutdx[self.x<=......
  • C++类和对象
    文章目录C++类和对象类和对象1.类和对象的基本概念注意事项:2.类的定义和成员注意事项:3.构造函数和析构函数注意事项:4.访问控制和封装注意事项:5.this指针注意事项:6.静态成员注意事项:7.常量成员函数和常量对象注意事项:8.友元函数和友元类注意事项:9......
  • Python面向对象课程设计
    面向对象程序设计面向对象编程(Object-orientedProgramming,简称OOP),是一种封装代码的方法。面向对象中,常用术语包括:类:可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的tortoise表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(......
  • java面对对象基础
    1.对象的内存布局类实例化为对象:类实例化为对象的语句一定要加括号,否则编译不通过//类名生成对象名=new类名()//类名生成对象名=new类名()ToolMytool=newTool();classTool{ publicbooleanoddOreven(intnum){ if(num%2!=0){ returntrue; }else{ retur......