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


  • 运行环境

   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. [ERROR]: gitstatus failed to initialize.

    1 问题描述 Manjaro升级后,zsh的主题p10k出现的问题. Your git prompt may disappear or become slow. Run the following c ...

  2. lvs 负载均衡 _DR模式 _Python脚本

    import paramiko vip='192.168.83.6' # 虚拟IP # direct_server_information ds_info={ 'ip':'192.168.83.5', ...

  3. JavaCV 视频滤镜(LOGO、滚动字幕、画中画、NxN宫格)

    其实,在JavaCV中除了FFmpegFrameGrabber和FFmpegFrameRecorder之外,还有一个重要的类,那就是FFmpegFrameFilter. FFmpegFrameFilt ...

  4. mysql索引性能验证,高性能的索引策略

    索引性能验证 1.无索引列的查询 在where条件中查询没有添加索引的列,性能会比较差.我们可以先在sqlyog中打开表t_user的数据,然后复制一个名字出来进行查询. /*无索引列的查询,索引不会 ...

  5. ASP程序写的项目与微信服务号(公众号)完美结合。仅需一个DLL组建WeixinDLL

    因ASP程序开发有很多优点,早年间ASP风靡全球,因此如今还在继续运营的ASP开发的项目仍在运行着,但是随着社交网络不断发达,特别是微信支付.微信通讯.小程序等的出现,导致很多ASP项目对接起来就比较 ...

  6. 从UWP项目移植到WinUI桌面版你需要做哪些事情

    就像文章标题说的我是打算写一篇从UWP移植到WinUI的帖子,本来打算是想写一篇WinUI的学习帖子,可是觉得市面上UWP的教程WPF的教程都是很多了,所以干脆就直接硬怼项目吧,先声明我不是来挖UWP ...

  7. POJ2536 二分图匹配

    题意:      有n只老鼠,m个洞,每个洞最多可以藏一只老鼠,每个老鼠的移动速度都是v,给你他们的当前坐标,和洞的坐标,突然老鹰来了,他们必须在s秒内跑到一个洞藏起来,问你最少有多少只老鼠被抓走了. ...

  8. PAT 乙级 -- 1010 -- 一元多项式求导

    题目简述 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出 ...

  9. Windows核心编程 第2 4章 异常处理程序和软件异常

    异常处理程序和软件异常 C P U引发的异常,就是所谓的硬件异常(hardware exception).操作系统和应用程序 也可以引发相应的异常,称为软件异常(software exception) ...

  10. XCTF-web_python_template_injection

    web_python_template_injection 这里涉及到flask的ssti漏洞(服务端模板注入). 简单点说就是,在使用flask/jinja2的模板渲染函数render_templa ...