• JDK自带的序列化框架使用


    目录

    序列化的定义

    在Java中如何将一个对象序列化呢?

    一个复杂对象如何进行序列化呢?

    缺点:

    JDK自带的序列化支持的数据类型


    序列化的定义

    序列化:把对象转化为可传输的字节序列过程称为序列化。

    反序列化:把字节序列还原为对象的过程称为反序列化

    序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。

    在Java中如何将一个对象序列化呢?

    最简单的把一个 String对象转化为字节流,再把字节流转化为一个String对象。

    1. // string 转成 byte[]
    2. public static byte[] stringToBytes(String str) {
    3. // 只支持英文字符
    4. if (str == null || str.length() == 0) {
    5. // 如果字符串为 null 或者为空 都是空的byte数组
    6. return new byte[0];
    7. }
    8. byte[] bytes = new byte[str.length()];
    9. char[] chars = str.toCharArray();
    10. for (int i = 0; i < bytes.length; i++) {
    11. bytes[i] = (byte) chars[i];
    12. }
    13. return bytes;
    14. }
    15. public static String byteToString(byte[] bytes) {
    16. if (bytes.length == 0) {
    17. return null;
    18. }
    19. int len = bytes.length;
    20. char[] charArray = new char[len];
    21. for (int i = 0; i < bytes.length; i++) {
    22. charArray[i] = (char) bytes[i];
    23. }
    24. return String.valueOf(charArray);
    25. }

    Java实现简单类的序列化(int 和 string字段的序列化)_trigger333的博客-CSDN博客

    一个复杂对象如何进行序列化呢?

    比如一个User对象,

    1. public class User{
    2. private Integer id;
    3. private String username;
    4. }

     这时可以使用jdk自带的序列化框架 JDK Serializable,只需要实现Serializable接口,就可以进行序列化。

    1. public class User implements Serializable {
    2. private static final long serialVersionUID = 5342726393385586669L;
    3. private Integer id;
    4. private String username;
    5. }

    JDK Serializable中通过serialVersionUID控制序列化类的版本,如果序列化与反序列化版本不一致,则会抛出java.io.InvalidClassException异常信息,提示序列化与反序列化SUID不一致。一般会手动指定SUID。

    Java 序列化详解_Gerald Newton的博客-CSDN博客_java序列化详解

    1. public class JdkSerializeFactory implements SerializeFactory {
    2. @Override
    3. public byte[] serialize(T t) {
    4. byte[] data = null;
    5. try {
    6. // 字节数组输出流在内存中创建一个字节数组缓冲区,所有发送
    7. // 到输出流的数据保存在该字节数组缓冲区中。
    8. // 创建字节数组输出流对象有以下几种方式。
    9. ByteArrayOutputStream os = new ByteArrayOutputStream();
    10. ObjectOutputStream output = new ObjectOutputStream(os);
    11. output.writeObject(t);
    12. //bugfix 解决readObject时候出现的eof异常
    13. output.writeObject(null);
    14. output.flush();
    15. data = os.toByteArray();
    16. // 关闭
    17. output.close();
    18. os.close();
    19. } catch (Exception e) {
    20. throw new RuntimeException(e);
    21. }
    22. return data;
    23. }
    24. @Override
    25. public T deserialize(byte[] data, Class clazz) {
    26. ByteArrayInputStream is = new ByteArrayInputStream(data);
    27. try {
    28. ObjectInputStream input = new ObjectInputStream(is);
    29. Object result = input.readObject();
    30. return ((T) result);
    31. } catch (IOException | ClassNotFoundException e) {
    32. throw new RuntimeException(e);
    33. }
    34. }
    35. }

    缺点:

    1. 不支持跨语言调用 : 如果调用的是其他语言开发的服务的时候就不支持了。
    2. 性能差 :相比于其他序列化框架性能更低,主要原因是序列化之后的字节数组体积较大,导致传输成本加大,同时在序列化反序列化的时候耗时比较长。

    JDK自带的序列化支持的数据类型

  • 相关阅读:
    2022/7/4前端开发面经
    【Lychee图床】本地电脑搭建私人图床,公网远程访问
    区块链实验室(25) - FISCO中PBFT耗时特征
    python用selenium网页模拟时xpath无法定位元素解决方法2
    Java数组基础之高效存储数据
    【从0到1开发一个网关】网关日志的开发
    Nginx显示failed (13: Permission denied)
    centos start ssh service
    小白立创机械狗从零到成品总结
    16 最长回文串
  • 原文地址:https://blog.csdn.net/weixin_40757930/article/details/126073337