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

对象序列化与反序列化

时间:2024-08-06 10:28:09浏览次数:12  
标签:java 对象 io import 序列化 Serializable

对象序列化与反序列化


在Java中,对象序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。反序列化则是将这些信息恢复为对象的过程。Java通过实现 java.io.Serializable 接口来支持对象的序列化和反序列化。

以下是对象序列化和反序列化的基本概念和步骤:

1. 使类实现 Serializable 接口

要使一个类的对象可以被序列化,该类需要实现 java.io.Serializable 接口。这个接口是一个标记接口,不包含任何方法。

import java.io.Serializable;

public class MyObject implements Serializable {
    // 类定义
}

2. 序列化对象

要序列化一个对象,你可以使用 ObjectOutputStream 类。

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class SerializationExample {
    public static void main(String[] args) {
        MyObject obj = new MyObject();
        // 对象初始化和设置属性...

        // 序列化对象
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("filename.obj"))) {
            oos.writeObject(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 反序列化对象

反序列化对象需要使用 ObjectInputStream 类。

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class DeserializationExample {
    public static void main(String[] args) {
        // 反序列化对象
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("filename.obj"))) {
            MyObject obj = (MyObject) ois.readObject();
            // 使用 obj...
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 处理序列化过程中的特殊情况

  • 可序列化和不可序列化对象的引用:如果一个可序列化对象中包含对不可序列化对象的引用,将导致序列化过程中出现 NotSerializableException
  • 序列化ID:为了确保序列化和反序列化的对象版本兼容,可以通过声明一个名为 serialVersionUID 的静态常量来指定类的唯一标识符。
  • 自定义序列化:通过实现 private void writeObjectprivate void readObject 方法,可以自定义对象的序列化和反序列化行为。

示例:添加 serialVersionUID

import java.io.Serializable;

public class MyObject implements Serializable {
    private static final long serialVersionUID = 1L; // 版本号

    // 类定义
}

注意事项

  • 只有实现了 Serializable 接口的类的实例才可以被序列化。
  • 序列化并不是保存所有字段的副本,而是保存对象的运行时状态。
  • 静态字段不会被序列化,因为它们不属于对象的状态。
  • 序列化过程中可能会抛出 IOException,因此在操作过程中需要处理异常。

标签:java,对象,io,import,序列化,Serializable
From: https://www.cnblogs.com/dengyingyuan/p/18344665

相关文章

  • 面向对象--方法
    目录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,基......
  • 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......
  • 重学面向对象-基础篇02包和访问控制
    包和访问控制基础概念包:用于区分类位置,将类分类package包的命名规则:英文和数字的组合,最好以域名形式com.test访问权限控制:private:私有,无法被除当前类以外的任何位置访问什么都不写:默认,只能被类本身和同包中的其他类访问protected:受保护,标记为受保护的内容可以能被类本身和......
  • 重学面向对象-基础篇01类与对象
    类与对象基础概念类:一类事物,比较概括性(动物)对象:类的实例,具体的某样事物(猫)属性:类的成员变量,表示某事物所具有的特征(性别)方法:对象可以做出的一些行为,是语句的集合,为了完成某件事情而存在(抓老鼠)方法定义时编写的参数,我们一般称为形式参数,而调用方法实际传入的参数,我们称为实际......
  • 面向对象设计基本原则
    本文由ChatMoney团队出品引言在软件开发过程中,随着系统复杂度的增加和业务变更,程序员面临诸多挑战,如耦合性、内聚性、可维护性、可扩展性和可重用性。设计模式能有效地解决这些问题。设计模式蕴含了面向对象的精髓,掌握面向对象设计和分析是掌握设计模式的基础。它能帮助我们......
  • Haskell:面向对象OOP的实现
    Haskell作为一种纯函数式编程语言,并不直接支持传统面向对象编程(OOP)中的类、继承、多态等概念。然而,Haskell的强大类型系统和一些高级特性允许开发者以函数式的方式模拟OOP的某些方面。以下是一些Haskell中模拟OOP支持的示例:1.使用记录(Record)和类型类(Typeclass)模......