Python&Java之序列化&反序列化

本文介绍了序列化和反序列化的概念,它们分别是将对象转化为字节和将字节还原为对象的过程,常用于永久存储、文件传输等场景。在Java中,实现Serializable接口是实现序列化的前提,通过ObjectOutputStream完成序列化,ObjectInputStream完成反序列化。而在Python中,常用的序列化模块有pickle和json,它们提供了简单的序列化和反序列化方法,例如pickle的dump和load。反序列化时,Python不会像Java那样因类型检查而报错,因为它是弱类型语言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先什么叫序列化和反序列化?

序列化:将对象转化为字节的过程。

反序列化:将字节/文件转为对象过程。

作用:

这样可以永久存储,文件,数据库,远程传输,你不可能把内存传输或者保存的吧?

Java序列化:

Java想要对类实现序列化,首先要实现一个接口(Serializable),不然会报错哦。

序列化首先要有这个对象(这个对象已经被实例化了),我们这里new了一个学术类

Student s=new Student();
s.setAge(22);
s.setName("小明");

其次,我们开始序列化,想要永久保存,需要用到IO流(而且是对象流):

ObjectOutputStream o=new ObjectOutputStream(new FileOutputStream(new File("./Student")));
o.writeObject(s);

到这里我们的序列化已经完成了。打开这个文件:

Java反序列化:

这个就容易了,同样需要用到对象流,而且是读的,

ObjectInputStream o=new ObjectInputStream(new FileInputStream(new File("./Student")));
Student student=(Student)o.readObject();

这样一个对象的序列化就完成了,对这个对象里的数据可以直接进行操作。

Tips:

在实现Serializable接口的时候,Eclispe会提示我们添加一个东西,

private static final long serialVersionUID = 1L;

这个作用就是在版本更替时候为了统一,我们序列化的时候写了这个,反序列化的时候改动了,就会报错。

----------------------------------

Python序列化:

这里Python有两个模块比较常用(pickle/json),

同样需要先有实例化的对象,在同模块转为字节,然后写入文件,上代码。

import pickle


class Student:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def get_name(self):
        return self.__name

    def get_age(self):
        return self.__age


s = Student("小明", 22)

with open("./Student", 'wb') as f:
    pickle.dump(s, f)

 

怎么样很简单吧?

我们打开看看

Python反序列化:

用样先读进来,再用模块反序列化,就可以直接调用。

with open("./Student", 'rb') as f:
    s = pickle.load(f)
    print(s.get_name())

Tips:

Python序列化不管哪个模块,dump是序列化(对象变字节文件),load(字节文件变对象)

由于Python属于弱类型语言,所以反序列化对象时候,idea是不提示方法的,

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值