首先什么叫序列化和反序列化?
序列化:将对象转化为字节的过程。
反序列化:将字节/文件转为对象过程。
作用:
这样可以永久存储,文件,数据库,远程传输,你不可能把内存传输或者保存的吧?
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是不提示方法的,