序列化定义以及使用和注意事项

什么是序列化和反序列化

序列化:是将对象转换为可传输或存储的过程,

反序列化:通常是将字节流或是其他数据格式或源数据转为对象的过程。

序列化的作用
  1. 对象的持久化:将对象的状态保存到磁盘或数据库中,以便在程序重新启动时恢复对象。
  2. 对象的传输:通过网络或其他通信方式将对象发送到远程系统,实现分布式系统的通信。
  3. 对象的缓存:将对象序列化后存储在缓存中,可以提高读取和响应速度。

总结来说序列化后可以传输,持久化保存到文件或系统缓存中进行交互。

java序列化转成字节流的好处

跨平台兼容以及方便传输和持久化存储: 字节流是一种通用的数据表示方式,可以在不同平台客户端,服务器之间传输或磁盘上或在数据库中存储

占用空间小和隐私安全: 字节流更紧凑,并且不直接暴露对象的内部结构和属性,占用更少的存储空间。

总结将对象序列化为字节流跨平台兼容以及方便传输,紧凑占用空间小和隐私更安全。

java中序列化的实现
类实现 Serializable 接口,

Serializable 接口没有任何方法,只是一个标记接口是一个约定和规范,是为了表明一个类可以被序列化会把对象转换为字节流,具体序列化过程就是通过流将对象写入流 在读出来

import java.io.Serializable;

public class MyClass implements Serializable {
    // 类的成员变量和方法
}
类实现 Externalizable 接口

需要实现 writeExternal 和 readExternal 方法,以提供更高度的自定义序列化和反序列化过程

import java.io.Externalizable;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class MyExternalizableClass implements Externalizable {
    @Override
    public void writeExternal(ObjectOutput out) {
        // 自定义序列化逻辑
    }
    @Override
    public void readExternal(ObjectInput in) {
        // 自定义反序列化逻辑
    }
}
将对象转为JSON格式或是解析JSON数据转为对象
// 通过jdk的ObjectMapper将对象转为json
AllPerson person = new AllPerson();
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(person);

// 还可以通过alibaba的fastjson或是hutoll的json工具
关于序列化注意的问题
定义serialVersionUID有什么用

serialVersionUID是一个用于版本控制的静态变量,用于确保在对象序列化和反序列化过程中,类的版本一致性

transient修饰成员变量不被序列化

如果在一个序列化的类中一些成员变量不需要或不能被序列化可以使用关键字transient修饰

NotSerializableException

如果一个类没有实现Serializable接口 但是在用流将类序列化时就会报错

关于JSON序列化的理解

将对象解析成JSon格式就是序列化的过程,将JSON数据解析为对象就是反序列化的过程,因为JSON也是一种通用的跨平台的格式

演示了如何将一个实现了 Serializable 接口的对象序列化成字节流,并在反序列化时还原对象
import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {
        // 创建一个实现了 Serializable 接口的对象
        MyClass myObject = new MyClass("Hello, Serialization!");

        // 将对象序列化为字节流
        try (FileOutputStream fileOut = new FileOutputStream("myobject.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
            out.writeObject(myObject);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 从字节流中反序列化对象
        try (FileInputStream fileIn = new FileInputStream("myobject.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
            MyClass restoredObject = (MyClass) in.readObject();
            System.out.println(restoredObject.getMessage()); // 输出: Hello, Serialization!
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class MyClass implements Serializable {
    private String message;

    public MyClass(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

  • 21
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
序列化是将对象转换为字节流的过,以便在网络传输或持久化存储时使用序列化可以将对象的状态保存到字节流中,然后在需要时将其恢复为原来的对象。 实现序列化的方式通常是通过在对象类中实现 `Serializable` 接口。这个接口是一个标记接口,没有任何方法定义,只是用来标识该类可以被序列化。当一个类实现了 `Serializable` 接口后,就表明该类的实例可以被序列化和反序列化Java中实现序列化的示例: ```java import java.io.*; public class SerializationExample implements Serializable { private String name; private int age; public SerializationExample(String name, int age) { this.name = name; this.age = age; } public void serialize(String fileName) throws IOException { FileOutputStream fileOut = new FileOutputStream(fileName); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(this); out.close(); fileOut.close(); } public static SerializationExample deserialize(String fileName) throws IOException, ClassNotFoundException { FileInputStream fileIn = new FileInputStream(fileName); ObjectInputStream in = new ObjectInputStream(fileIn); SerializationExample obj = (SerializationExample) in.readObject(); in.close(); fileIn.close(); return obj; } } ``` 上述示例中,`SerializationExample` 类实现了 `Serializable` 接口,并提供了 `serialize` 和 `deserialize` 方法用于对象的序列化和反序列化注意事项: 1. 序列化只能处理对象的状态,而不能处理静态变量和 transient 标记的变量。 2. 序列化的对象版本号应该是唯一的,以防止反序列化时版本不匹配的问题。 3. 序列化和反序列化的类名、字段名等需要保持一致,否则可能会导致反序列化失败。 4. 序列化的类应该谨慎处理敏感信息,以防止数据泄露的风险。 5. 序列化的性能可能较低,特别是对于大对象和复杂对象图。因此,在需要高效传输和存储时,可以考虑使用其他序列化方式,如JSON或Protocol Buffers。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wrx繁星点点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值