序列化与反序列化

简介: 原先仅仅知道序列化需要实现Serializable即可,这会因为接口返回结果是序列化的json对象,需要做反序列化处理,这次就理一理,序列化的相关知识,总结下,如有描述错误的,请评论指出

序列化

先看下百度百科的介绍
截屏2022-10-04 16.51.15.png
我们可以简单理解为序列化就是将实例转化为二进制数据存储起来的过程,反序列化就是相反的过程

为什么会出现序列化,有什么用?

在实际工作项目中,对象实例化后是在内存中存储的,对象也会被回收,要想永久保存对象数据,就需要序列化了。

如何实现序列化

1.创建Person并实现Serializable接口
import java.io.Serializable;

public class Person implements Serializable {
    private  String name;
    private  String bankId;
    private  static String sex="男";
    private  transient String password;
    private static final long serialVersionUID = -3234214123421341234L;

    public Person(String name,String bankId,String password) {
        this.name = name;
        this.bankId=bankId;
        this.password=password;
    }
}
2.序列化与反序列化
import java.io.*;

import com.google.gson.Gson;

public class SerialDemo {

    //序列化
    public static void serialization() throws Exception{
        //创建个文件来接受写序列化后的数据
        File f = new File("Person.txt");
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
        //实例化个对象
        Person p = new Person("A","123456789","abcdefg");
        //将对象写到文档中
        out.writeObject(p);
        out.close();
        System.out.println("序列化完成");
    }

    //反序列化
    public static void deserialization() throws Exception{
        File f = new File("Person.txt");
        //读取文件中的数据转为对象
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
        Object newP = in.readObject();
        in.close();
        //可以打印下反序列化生成的对象newP
        System.out.println(new Gson().toJson(newP));
        System.out.println("反序列化完成");
    }
    public static void main(String[] args) throws Exception {
        serialization();
        deserialization();

    }
}
3.运行结果

截屏2022-10-05 10.18.06.png

需要注意的点

  • 被static修饰的属性无法被序列化(这个很好理解静态属性是与类绑定的而不是对象)
  • 被transient修饰的属性无法被序列化(有些成员变量不需要被序列化,如Person中的password)
  • serialVersionUID是序列化的版本号(基本序列化的对象都会显示的声明一下,以防对象被修改导致无法序列化)

java原生序列化的缺点

  • 无法跨语言 Java序列化的字节数组,其他语言无法反序列化
  • 序列化后的码流太大
  • 序列化性能太低

目前主流序列化框架

json、ProtoBuf

目录
相关文章
|
16天前
|
存储 开发框架 .NET
解锁SqlSugar新境界:利用Serialize.Linq实现Lambda表达式灵活序列化与反序列化,赋能动态数据查询新高度!
【8月更文挑战第3天】随着软件开发复杂度提升,数据查询的灵活性变得至关重要。SqlSugar作为一款轻量级、高性能的.NET ORM框架,简化了数据库操作。但在需要跨服务共享查询逻辑时,直接传递Lambda表达式不可行。这时,Serialize.Linq库大显身手,能将Linq表达式序列化为字符串,实现在不同服务间传输查询逻辑。结合使用SqlSugar和Serialize.Linq,不仅能够保持代码清晰,还能实现复杂的动态查询逻辑,极大地增强了应用程序的灵活性和可扩展性。
39 2
|
13天前
|
存储 算法 Python
【Leetcode刷题Python】297. 二叉树的序列化与反序列化
LeetCode第297题"二叉树的序列化与反序列化"的Python语言解决方案,包括序列化二叉树为字符串和反序列化字符串为二叉树的算法实现。
15 5
|
18天前
|
开发框架 缓存 前端开发
基于SqlSugar的开发框架循序渐进介绍(24)-- 使用Serialize.Linq对Lambda表达式进行序列化和反序列化
基于SqlSugar的开发框架循序渐进介绍(24)-- 使用Serialize.Linq对Lambda表达式进行序列化和反序列化
|
4天前
|
JSON 缓存 安全
Python pickle 二进制序列化和反序列化 - 数据持久化
Python pickle 二进制序列化和反序列化 - 数据持久化
10 0
|
25天前
|
存储 安全 Java
day24:Java零基础 - 序列化与反序列化
【7月更文挑战第24天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
22 1
|
1月前
|
存储 Java
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)
|
1月前
|
分布式计算 Java 数据库
Java中的序列化与反序列化详解
Java中的序列化与反序列化详解
|
2月前
|
JSON Java API
jackson序列化和反序列化中的注解和扩展点大全【收藏】
jackson序列化和反序列化中的注解和扩展点大全【收藏】
|
2月前
|
存储 JSON 数据库
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
|
2月前
|
网络协议 Java API
【Java】序列化和反序列化
【Java】序列化和反序列化
28 4