赞
踩
目录
(1)Java序列化就是指把Java对象转换为字节序列的过程 比如可以将一个类转化为json类型
Java反序列化就是指把字节序列恢复为Java对象的过程。
(2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
在Java中,只要一个类实现了java.io.Serializable
接口,那么它就可以被序列化。
我们先来测试一下,首先写一个实体类 User
- package com.hollis;
- import java.io.Serializable;
- import java.util.Date;
-
-
- public class User implements Serializable{
- private String name;
- private int age;
- private Date birthday;
- private transient String gender;
- private static final long serialVersionUID = -6849794470754667710L;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public Date getBirthday() {
- return birthday;
- }
-
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
-
- public String getGender() {
- return gender;
- }
-
- public void setGender(String gender) {
- this.gender = gender;
- }
-
- @Override
- public String toString() {
- return "User{" +
- "name='" + name + ''' +
- ", age=" + age +
- ", gender=" + gender +
- ", birthday=" + birthday +
- '}';
- }
- }

对User进行实体化的Demo
- package com.hollis;
- import org.apache.commons.io.FileUtils;
- import org.apache.commons.io.IOUtils;
- import java.io.*;
- import java.util.Date;
-
-
- public class SerializableDemo {
-
- public static void main(String[] args) {
- //Initializes The Object
- User user = new User();
- user.setName("hollis");
- user.setGender("male");
- user.setAge(23);
- user.setBirthday(new Date());
- System.out.println(user);
-
- //Write Obj to File
- ObjectOutputStream oos = null;
- try {
- oos = new ObjectOutputStream(new FileOutputStream("tempFile"));
- oos.writeObject(user);
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- IOUtils.closeQuietly(oos);
- }
-
- //Read Obj from File
- File file = new File("tempFile");
- ObjectInputStream ois = null;
- try {
- ois = new ObjectInputStream(new FileInputStream(file));
- User newUser = (User) ois.readObject();
- System.out.println(newUser);
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } finally {
- IOUtils.closeQuietly(ois);
- try {
- FileUtils.forceDelete(file);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- }
- }
- //output
- //User{name='hollis', age=23, gender=male, birthday=Tue Feb 02 17:37:38 CST 2016}
- //User{name='hollis', age=23, gender=null, birthday=Tue Feb 02 17:37:38 CST 2016}

1、在Java中,只要一个类实现了java.io.Serializable
接口,那么它就可以被序列化。
2、通过ObjectOutputStream
和ObjectInputStream
对对象进行序列化及反序列化
3、虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID
)
4、序列化并不保存静态变量。
5、要想将父类对象也序列化,就需要让父类也实现Serializable
接口。
6、Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。