其他分享
首页 > 其他分享> > 序列化和反序列化

序列化和反序列化

作者:互联网

序列化理解起来很简单 - 知乎 (zhihu.com)

定义

序列化:把对象转化为可传输的字节序列过程称为序列化。

反序列化:把字节序列还原为对象的过程称为反序列化。

目的

序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组 

Java 是如何实现序列化

要实现Serializable 接口

public class User implements Serializable{
 //年龄
 private int age;
 //名字
 private String name ;

 public int getAge() {
 return age;
    }
 public void setAge(int age) {
 this.age = age;
    }

 public String getName() {
 return name;
    }

 public void setName(String name) {
 this.name = name;
    }
}

写入 

FileOutputStream fos = new FileOutputStream("D:\\temp.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);

User user = new User();
user.setAge(18);
user.setName("sandy");
oos.writeObject(user);

oos.flush();
oos.close();

读出 

FileInputStream fis = new FileInputStream("D:\\temp.txt");

ObjectInputStream oin = new ObjectInputStream(fis);

User user = (User) oin.readObject();

System.out.println("name="+user.getName());

输出结果为:name=sandy

以上把User对象进行二进制的数据存储后,并从文件中读取数据出来转成User对象就是一个序列化和反序列化的过程。

序列化常见问题

 序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量

读出值为bull

序列化是以正向递归的形式进行的,如果父类实现了序列化那么其子类都将被序列化;子类实现了序列化而父类没实现序列化,那么只有子类的属性会进行序列化,而父类的属性是不会进行序列化的

(1)子类实现序列化,父类不实现序列化

//父类
public class Parent {
 //爱好
 private String like;
}
//子类
public class User extends Parent implements Serializable {

 //年龄
 private int age;
 //名字
 private String name;

}

//序列化User对象存储到temp.txt
FileOutputStream fos = new FileOutputStream("D:\\temp.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);

User user = new User();
user.setName("sandy");
user.setAge(18);
user.setLike("看美女");
oos.writeObject(user);

oos.flush();
oos.close();

//从temp.txt 反序列化转为User对象
FileInputStream fis = new FileInputStream("D:\\temp.txt");

ObjectInputStream oin = new ObjectInputStream(fis);

User user1 = (User) oin.readObject();

System.out.println("like="+user1.getLike());

结果:like=null

父类属性未被序列化 

 (2)父类实现序列化,子类不实现序列化

//父类
public class Parent implements Serializable{
 //爱好
 private String like;
}

//子类
public class User extends Parent {
 //年龄
 private int age;
 //名字
 private String name;

}

//序列化User对象存储到temp.txt
FileOutputStream fos = new FileOutputStream("D:\\temp.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);

User user = new User();
user.setName("sandy");
user.setAge(18);
user.setLike("看美女");
oos.writeObject(user);

oos.flush();
oos.close();

//从temp.txt 反序列化转为User对象
FileInputStream fis = new FileInputStream("D:\\temp.txt");

ObjectInputStream oin = new ObjectInputStream(fis);

User user1 = (User) oin.readObject();

System.out.println("name="+user1.getName());

结果:name=sandy

子类属性序列化正常 


 

 

 

 

标签:name,User,oos,new,序列化,user
来源: https://blog.csdn.net/xinyihhh/article/details/123127615