我们的火,要把世界都点燃


  • 运行环境

   JDK8 + IntelliJ IDEA 2018.3

  • 什么是序列化,反序列化

序列化是将对象状态转换为可保持或传输的格式的过程。

与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

反序列化是指将存储在存储媒体中的对象状态装换成对象的过程

  • 序列化的作用

  1.  以某种存储形式使自定义对象持久化;
  2. 将对象从一个地方传递到另一个地方。
  3. 保证对象的完整性和可传递性。
  4.  使程序更具维护性
  • 如何实现类的序列化?

    实现Serializable接口

  • 编程实现类的序列化:

 1 关键代码
2 public static void main(String[] args) throws Exception{
3
4 Student stu = new Student();
5
6 File file = new File("bb.dat");
7
8 ObjectOutputStream oos = new ObjectOutputStream(new
9
10 FileOutputStream(file));
11
12 oos.writeObject(stu);
13 }
  • 编程实现类的反序列化:

 

 1 public static void main(String[] args) throws Exception{
2
3 File file = new File("bb.dat");
4
5 ObjectInputStream ois = new ObjectInputStream(new
6
7 FileInputStream(file));
8
9 Object obj = ois.readObject();
10
11 System.out.println(obj.hashCode());
12 }
  • 多对象Serializable(序列化)的实现

    序列化鱼,还需要序列化鱼的生存环境---水。

 1 //环境:  水
2 import java.io.Serializable;
3
4 public class Water implements Serializable {
5 int opacity;
6
7 public Water(int opacity) {
8 this.opacity = opacity;
9 }
10
11 public Water() {
12 }
13
14 @Override
15 public String toString() {
16 return "Water{" +
17 "opacity=" + opacity +
18 '}';
19 }
20 }
 1 import java.io.Serializable;
2
3 public class Fish implements Serializable {
4
5 String color;
6 String type;
7 Water enviroment;
8
9 public Fish(String color, String type, Water enviroment) {
10 this.color = color;
11 this.type = type;
12 this.enviroment = enviroment;
13 }
14
15 public Fish(String color, String type) {
16 this.color = color;
17 this.type = type;
18 }
19
20 public Fish() {
21 }
22
23 @Override
24 public String toString() {
25 return "Fish{" +
26 "color='" + color + '\'' +
27 ", type='" + type + '\'' +
28 ", enviroment=" + enviroment +
29 '}';
30 }
31 }
import java.io.*;
// 序列化
public class TestFish {
public static void main(String[] args) {
Water enro = new Water(99);
Fish fish = new Fish("金色", "鲤鱼", enro); File file = new File("fish.bat");
try {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(file));
oos.writeObject(fish); oos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} // 反序列化
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; public class TestFish2 {
public static void main(String[] args) {
try {
ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream("fish.bat"));
try {
Fish fish=(Fish) objectInputStream.readObject();
System.out.println(fish);
objectInputStream.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

 ¤  transient关键字:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。

  • 浅克隆 —— 只克隆本身

    被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然只指向原来的对象。

  代码演示:

 1 package com.wenhaitao.yxdemo.demo4;
2 public class Professor {
3 String name;
4 int age;
5
6 public Professor(String name, int age) {
7 super();
8 this.name = name;
9 this.age = age;
10 }
11
12 public Professor() {
13 super();
14 }
15
16 @Override
17 public String toString() {
18 return "Professor [age=" + age + ", name=" + name + "]";
19 }
20
21 }
 1  // 浅克隆 2
3 public class Student implements Cloneable {
4 String name;
5 int age;
6
7 Professor p;
8
9 public Professor getP() {
10 return p;
11 }
12
13 public void setP(Professor p) {
14 this.p = p;
15 }
16
17 @Override
18 public Object clone() throws CloneNotSupportedException {
19 return super.clone();
20 }
21
22 public Student() {
23 super();
24 }
25
26 public Student(String name, int age) {
27 super();
28 this.name = name;
29 this.age = age;
30 }
31
32 public Student(String name, int age, Professor p) {
33 super();
34 this.name = name;
35 this.age = age;
36 this.p = p;
37 }
38
39 @Override
40 public String toString() {
41 return "Student [age=" + age + ", name=" + name + ", p=" + p + "]";
42 }
43
44 public static void main(String[] args) throws CloneNotSupportedException {
45 Professor p = new Professor("feifeiye",50);
46 Student s1 = new Student("zhangsan", 19, p);
47 Student s2 = (Student) s1.clone();
48 System.out.println(s1);
49 System.out.println(s2);
50 System.out.println(s1==s2);
51
52 s2.p.name = "wangwu";
53 s2.p.age = 90;
54 System.out.println(s2);
55 System.out.println(s1);
56 }
57 }
  • 深克隆 —— 克隆本身和所有的成员

    概述:

      被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量,

      那些引用其他对象的变量将指向被复制过的新对象,而不再指向原有的那些被引用的对象,

      换言之,深复制把要复制的对象所引用的对象都复制了一遍。

  代码演示:

  

 1 2 public class Professor implements Cloneable{
3 String name;
4 int age;
5
6 public Professor(String name, int age) {
7 super();
8 this.name = name;
9 this.age = age;
10 }
11
12 public Professor() {
13 super();
14 }
15
16 public Object clone() throws CloneNotSupportedException {
17 return super.clone();
18 }
19
20
21 @Override
22 public String toString() {
23 return "Professor [age=" + age + ", name=" + name + "]";
24 }
25
26 }
 1 //深克隆
2 public class Student implements Cloneable {
3 String name;
4 int age;
5
6 Professor p;
7
8 public Professor getP() {
9 return p;
10 }
11
12 public void setP(Professor p) {
13 this.p = p;
14 }
15
16 @Override
17 public Object clone() throws CloneNotSupportedException {
18 Object obj = super.clone();
19 Student s = (Student) obj;
20 s.p = (Professor) this.p.clone();
21 return obj;
22 }
23
24 public Student() {
25 super();
26 }
27
28 public Student(String name, int age) {
29 super();
30 this.name = name;
31 this.age = age;
32 }
33
34 public Student(String name, int age, Professor p) {
35 super();
36 this.name = name;
37 this.age = age;
38 this.p = p;
39 }
40
41 @Override
42 public String toString() {
43 return "Student [age=" + age + ", name=" + name + ", p=" + p + "]";
44 }
45
46 public static void main(String[] args) throws CloneNotSupportedException {
47 Professor p = new Professor("肥肥也",19);
48 Student s1 = new Student("都一样", 19, p);
49 Student s2 = (Student) s1.clone();
50 System.out.println(s1);//
51 System.out.println(s2);
52 System.out.println(s1==s2);
53
54 s2.p.name = "zhaoliu";
55 s2.p.age = 60;
56 System.out.println(s2);//
57 System.out.println(s1);
58 }
59 }

总结:

  1.     如果自定义类型包含引用类型的数据成员,必须考虑Clone方法是实现浅拷贝(shallow copy)还是深拷贝(deep copy)。
  2.   浅拷贝是指副本对象中的引用类型的数据成员与源对象的数据成员指向相同的对象。而如果是深拷贝,则必须创建整个对象的结构,副本对象中的引用      类型的数据成员与源对象的数据成员指向不同的对象。
  3. 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
  4. 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

PS:

如果,您希望更容易地发现我的新博客,不妨点击一下关注。

如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,

因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【肥肥也】!

Java 的序列化 (Serializable)(Day_09)的更多相关文章

  1. Java基础--序列化Serializable

    对Java对象序列化的目的是持久化对象或者为RMI(远程方法调用)传递参数和返回值. 下面是一个序列化对象写入文件的例子: ---------------------------- package u ...

  2. Java 的序列化Serializable接口介绍及应用

    常看到类中有一串很长的 如 private static final long serialVersionUID = -4667619549931154146L;的数字声明.这些其实是对此类进行序列化 ...

  3. JAVA 对象序列化——Serializable

    1.序列化是干什么的?       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object st ...

  4. JAVA 对象序列化——Serializable(转)

    文章出自:http://www.cnblogs.com/chenfei0801/archive/2013/04/05/3001149.html Java的对象序列化是指将那些实现了Serializab ...

  5. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  6. Java 序列化Serializable接口

    1 什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2  什么情况下需要 ...

  7. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

  8. JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

    JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...

  9. Java序列化Serializable和Externalizable

    纸上得来终觉浅,绝知此事要躬行  --陆游       问渠那得清如许,为有源头活水来  --朱熹 什么是Java序列化?为什么出现Java序列化?怎样实现Java序列化? 一.什么是Java序列化 ...

随机推荐

  1. kube-batch(一)安装

    安装 官方:https://github.com/kubernetes-sigs/kube-batch 下载镜像 安装 官方:https://github.com/kubernetes-sigs/ku ...

  2. .Net Core 集成 Kafka

    最近维护的一个系统并发有点高,所以想引入一个消息队列来进行削峰.考察了一些产品,最终决定使用kafka来当做消息队列.以下是关于kafka的一些知识的整理笔记. kafka kafka 是分布式流式平 ...

  3. 聊一聊Jmeter的参数化

    背景 前面一篇讲了 JMeter 的一个最简单的例子,这篇聊一下 JMeter 的参数化. 在开始之前先来一个单元测试的例子,感受一下参数化. 上面是一个用 xUnit 写的单元测试,这个单元测试就是 ...

  4. 没有SEO的DiscuzQ 值不值得站长选择?

    此文写于2021年1月22日.至少到今天,Discuz Q 依然没有推出SEO的解决方案. 据官方团队交流说,SEO是在需求池中排在第一位,但目前还没有相应的措施来解决无法SEO. Discuz Q: ...

  5. git平时用到的仓库

    github茫茫仓库 若水三千,取一瓢饮 doocs/technical-books doocs/leetcode lepture/editor pandao/editor.md 未完..待续!!积累 ...

  6. 【SpringBoot】Springboot1.5.9整合WebSocket

    一.WebSocket介绍 1.WebSocket是什么? WebSocket是协议,是HTML5开始提供的基于TCP(传输层)的一种新的网络协议, 它实现了浏览器与服务器全双工(full-duple ...

  7. C#-获取页面源代码

    /// <summary> /// 获取源代码 /// </summary> /// <param name="url"></param& ...

  8. Flask 实现分页

    pager.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  9. 分子动力学模拟软件VMD的安装与使用

    技术背景 在分子动力学模拟过程中会遇到一些拓扑结构非常复杂的分子模型,所谓的复杂不仅仅是包含众多的原子,还有各种原子之间的成键关系与成键类型等.这时候就非常能够体现一个好的可视化软件的重要性了,这里我 ...

  10. Day002 Java三大版本

    Java三大版本 Write Once .Run Anywhere JavaSE: 标准版(桌面程序,控制台开发......) JavaME:嵌入式开发(手机,小家电.......) JavaEE:E ...