序列化、反序列化及装饰器模式

以你之姓@ 2023-10-06 08:07 171阅读 0赞

序列化、反序列化及装饰器模式

  • 序列化、反序列化
    • 序列化/反序列化的步骤和实例
  • 装饰器模式简介及演示

序列化、反序列化

概念:
当两个进程远程通信时,彼此可以发送各种类型的数据。 无论是何种类型的数据,都会以二进制序列的形式在网络上传送。比如,我们可以通过http协议发送字符串信息;我们也可以在网络上直接发送Java对象。 发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象才能正常读取。

把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化

  1. 对象序列化的作用有如下两种:
  2. 1. 持久化: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中,比如:休眠的实现。以后服务器session管理,hibernate将对象持久化实现。
  3. 2. 网络通信:在网络上传送对象的字节序列。比如:服务器之间的数据通信、对象传递。

序列化涉及的类和接口
ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

只有实现了Serializable接口的类的对象才能被序列化。 Serializable接口是一个空接口,只起到标记作用。

序列化/反序列化的步骤和实例

例:将Person类的实例进行序列化和反序列化

  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.io.Serializable;
  7. //Person类实现Serializable接口后,Person对象才能被序列化
  8. class Person implements Serializable {
  9. // 添加序列化ID,它决定着是否能够成功反序列化!
  10. private static final long serialVersionUID = 1L;
  11. int age;
  12. boolean isMan;
  13. String name;
  14. public Person(int age, boolean isMan, String name) {
  15. super();
  16. this.age = age;
  17. this.isMan = isMan;
  18. this.name = name;
  19. }
  20. @Override
  21. public String toString() {
  22. return "Person [age=" + age + ", isMan=" + isMan + ", name=" + name + "]";
  23. }
  24. }
  25. public class TestSerializable {
  26. public static void main(String[] args) {
  27. FileOutputStream fos = null;
  28. ObjectOutputStream oos = null;
  29. ObjectInputStream ois = null;
  30. FileInputStream fis = null;
  31. try {
  32. // 通过ObjectOutputStream将Person对象的数据写入到文件中,即序列化。
  33. Person person = new Person(18, true, "高淇");
  34. // 序列化
  35. fos = new FileOutputStream("d:/c.txt");
  36. oos = new ObjectOutputStream(fos);
  37. oos.writeObject(person);
  38. oos.flush();
  39. // 反序列化
  40. fis = new FileInputStream("d:/c.txt");
  41. // 通过ObjectInputStream将文件中二进制数据反序列化成Person对象:
  42. ois = new ObjectInputStream(fis);
  43. Person p = (Person) ois.readObject();
  44. System.out.println(p);
  45. } catch (ClassNotFoundException e) {
  46. e.printStackTrace();
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. } finally {
  50. //关闭流及抛出异常
  51. }
  52. }

注意

**1. static属性不参与序列化。

  1. 对象中的某些属性如果不想被序列化,不能使用static,而是使用transient修饰。
  2. 为了防止读和写的序列化ID不一致,一般指定一个固定的序列化ID。**

装饰器模式简介及演示

简介:装饰器模式是GOF23种设计模式中较为常用的一种模式。它可以实现对原有类的包装和装饰,使新的类具有更强的功能。

  1. 我这里有智能手机iphone, 我们可以通过加装投影组件,实现原有手机功能的
  2. 扩展。这就是一种“装饰器模式”。 我们在未来给普通人加装“外骨骼”装
  3. 饰,让普通人具有力扛千斤的能力,也是一种“装饰器模式”。

演示:

  1. class Iphone {
  2. private String name;
  3. public Iphone(String name) {
  4. this.name = name;
  5. }
  6. public void show() {
  7. System.out.println("我是" + name + ",可以在屏幕上显示");
  8. }
  9. }
  10. class TouyingPhone {
  11. public Iphone phone;
  12. public TouyingPhone(Iphone p) {
  13. this.phone = p;
  14. }
  15. // 功能更强的方法
  16. public void show() {
  17. phone.show();
  18. System.out.println("还可以投影,在墙壁上显示");
  19. }
  20. }
  21. public class TestDecoration {
  22. public static void main(String[] args) {
  23. Iphone phone = new Iphone("iphone30");
  24. phone.show();
  25. System.out.println("===============装饰后");
  26. TouyingPhone typhone = new TouyingPhone(phone);
  27. typhone.show();
  28. }
  29. }

发表评论

表情:
评论列表 (有 0 条评论,171人围观)

还没有评论,来说两句吧...

相关阅读

    相关 序列序列

    个人学习理解 (只是自己默写序列化和反序列的代码以及几个问题) 1.序列化 和 反序列化 1.1 什么是序列化 和 反序列化 或者 你如何理解序列化和

    相关 序列序列

    序列化: 对象的序列化主要有两种用途:   1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;   2) 在网络上传送对象的字节序列。   

    相关 .net序列序列

    序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了。 比如,一个计数器,数值为2,我们可以用字符串“2”表示。