序列化(python、java)

来源:互联网 发布:人格训练软件森 编辑:程序博客网 时间:2024/04/30 05:05

我们把变量从内存中变成可存储或传输的过程称之为序列化(对象转化为字节序列),其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里);二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。在Python中叫pickling;在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

Python提供了pickle模块来实现序列化。

import pickle
d = dict(name=’Bob’, age=20, score=88)
pickle.dumps(d)
b’\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.’

pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:

f = open(‘dump.txt’, ‘wb’)
pickle.dump(d, f)
f.close()

当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:

f = open(‘dump.txt’, ‘rb’)
d = pickle.load(f)
f.close()
d
{‘age’: 20, ‘score’: 88, ‘name’: ‘Bob’}

java:
Person类,实现了Serializable接口,它包含三个字段:name,String类型;age,Integer类型;gender,Gender类型。另外,还重写该类的toString()方法,以方便打印Person实例中的内容。

                                                                                          public class Person implements Serializable {      private String name = null;      private Integer age = null;      private Gender gender = null;      public Person() {          System.out.println("none-arg constructor");      }      public Person(String name, Integer age, Gender gender) {          System.out.println("arg constructor");          this.name = name;          this.age = age;          this.gender = gender;      }      public String getName() {          return name;      }      public void setName(String name) {          this.name = name;      }      public Integer getAge() {          return age;      }      public void setAge(Integer age) {          this.age = age;      }      public Gender getGender() {          return gender;      }      public void setGender(Gender gender) {          this.gender = gender;      }      @Override     public String toString() {          return "[" + name + ", " + age + ", " + gender + "]";      }  } 

public class SimpleSerial {

    public static void main(String[] args) throws Exception {          File file = new File("person.out");          ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(file));          Person person = new Person("John", 101, Gender.MALE);          oout.writeObject(person);   //写入文件        oout.close();          ObjectInputStream oin = new ObjectInputStream(new FileInputStream(file));          Object newPerson = oin.readObject(); // 没有强制转换到Person类型          oin.close();                         //读取对象        System.out.println(newPerson);      }  } 
原创粉丝点击