import java.io.*;
 import java.util.Date;
 import java.util.Random;

 public class Test {
     public static void main(String[] args){
 //        Worm.test();
 //        Blip.test();
 //        Login.test();
         SerialCtl.test();
     }
 }

 class Data implements Serializable {
     private int n;

     public Data(int n) {
         this.n = n;
     }

     public String toString() {
         return Integer.toString(n);
     }
 }

 class Worm implements Serializable {
     private static final int SIZE = 1024;
     private static Random random = new Random(47);
     private Data[] datas = new Data[]{
             new Data(random.nextInt(10)),
             new Data(random.nextInt(10)),
             new Data(random.nextInt(10))
     };

     private Worm next;
     private char c;

     public Worm(int i, char c) {
         System.out.println("Worm Constructor: " + i);
         this.c=c;
         if (--i > 0) {
             next=new Worm(i,(char)(c+1));
         }
     }

     public Worm() {
         System.out.println("Default Constructor");
     }

     public String toString() {
         StringBuilder sb = new StringBuilder(":");
         sb.append("c");
         sb.append("(");
         for (Data data : datas) {
             sb.append(data);
         }
         sb.append(")");
         if (next != null) {
             sb.append(next);
         }
         return sb.toString();
     }

     public static void test() {
         try{
             Worm w = new Worm(6, 'a');
             System.out.println("w  = "+w);

             /*

             //创建ObjectOutputStream用于储存序列化结果
             ObjectOutputStream out = new ObjectOutputStream(
                     new FileOutputStream("worm.out"));

             out.writeObject("Worm Storage\n");
             out.writeObject(w);
             out.close();

             //创建ObjectInputStream用于读取序列化数据
             ObjectInputStream in = new ObjectInputStream(
                     new FileInputStream("worm.out"));

             //从序列化数据恢复时,需要按照序列化顺序
             String s = (String)in.readObject();
             Worm w2 = (Worm)in.readObject();
             System.out.println(s+"w2 = "+w);

             */

             //测试,将序列化数据储存在ByteArrayOutputStream中

             //这个地方这样写,不便于后面操作
             /*
             ObjectOutputStream out2 = new ObjectOutputStream(
                     new ByteArrayOutputStream());
             */

             ByteArrayOutputStream bs = new ByteArrayOutputStream();
             ObjectOutputStream out2 = new ObjectOutputStream(bs);
             out2.writeObject("Worm Storage In Bytes...\n");
             out2.writeObject(w);
             out2.flush();

             ObjectInputStream in2 = new ObjectInputStream(
                     new ByteArrayInputStream(bs.toByteArray()));

             String s2 = (String)in2.readObject();
             Worm w3 = (Worm)in2.readObject();

             System.out.println(s2 + "w3 = "+w3);

         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         }
     }
 }

 /*
     Serializable序列化时,对象完全以它存储的二进制为为基础来构造,而不调用构造器
     Externnlizable序列化时,所有普通的默认构造器都会被调用(包括字段定义时的初始
     化),然后调用readExternal()
  */
 class Blip implements Externalizable {
     private int i;
     private String s;

     public Blip() {
         System.out.println("Constructor: Blip()");
     }

     public Blip(String s, int i) {
         System.out.println("Constructor: Blip(String s, int i)");

         this.s=s;
         this.i=i;
     }

     public String toString() {
         return s + i;
     }

     @Override
     public void writeExternal(ObjectOutput out) throws IOException {
         System.out.println("Blip.writeExternal...");
         out.writeObject(s);
         //这个地方写了一个BUG,用Object会造成自动装箱,导致readInt()读不出来结果
         //out.writeObject(i);
         out.writeInt(i);
     }

     @Override
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
         System.out.println("Blip.readExternal...");
         this.s = (String)in.readObject();
         this.i = in.readInt();
     }

     public static void test() {
         try{
             Blip b = new Blip("A String...", 47);
             System.out.println(b);

             //创建输出流
             ObjectOutputStream out = new ObjectOutputStream(
                     new FileOutputStream("Blip.out"));
             out.writeObject(b);
             out.close();

             //创建输入流
             ObjectInputStream in = new ObjectInputStream(
                     new FileInputStream("Blip.out"));
             Blip b2 = (Blip)in.readObject();
             System.out.println(b2);

         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         }

     }
 }

 /*
     测试 Transient关键字
  */
 class Login implements Serializable {
     private Date date = new Date();
     private String username;
     private transient String password;

     public Login(String name, String password) {
         this.username = name;
         this.password=password;
     }

     public String toString() {
         return "Login info:"+
                 "\n   username:"+username+
                 "\n   password:"+password+
                 "\n   date:"+date;
     }

     public static void test() {
         try{
             Login l = new Login("zhangshan", "123456");
             System.out.println("Login l = "+l);

             //创建输出流
             ObjectOutputStream out = new ObjectOutputStream(
                     new FileOutputStream("login.out"));
             out.writeObject(l);

             //创建输入流
             ObjectInputStream in = new ObjectInputStream(
                     new FileInputStream("login.out"));
             Login m = (Login)in.readObject();
             System.out.println("Login m = "+m);

         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         }

     }
 }

 /*
     Externalizable的替代方案,非常混乱的一个方案,没有研究的价值
  */
 class SerialCtl implements Serializable {
     private String username;
     private transient String password;

     public SerialCtl(String name, String password) {
         this.username=name;
         this.password=password;
     }

     public String toString() {
         return username+"\n"+password;
     }

     private void writeObject(ObjectOutputStream outputStream)
         throws IOException{
         outputStream.defaultWriteObject();
         outputStream.writeObject(password);
     }

     private void readObject(ObjectInputStream inputStream)
         throws IOException,ClassNotFoundException{
         inputStream.defaultReadObject();
         password=(String)inputStream.readObject();
     }

     public static void test() {
         SerialCtl sc = new SerialCtl("Test1", "Test2");
         System.out.println("Before:\n"+sc);

         try{
             //创建输出流
             ObjectOutputStream out = new ObjectOutputStream(
                     new FileOutputStream("SerialCtl.out"));
             out.writeObject(sc);

             //创建输入流
             ObjectInputStream in = new ObjectInputStream(
                     new FileInputStream("SerialCtl.out"));
             SerialCtl sc2 = (SerialCtl)in.readObject();
             System.out.println("Now:\n"+sc2);
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         }
     }
 }

Java编程思想:序列化基础部分的更多相关文章

  1. 《java编程思想》--多线程基础--Runnable

    一.简单说下Runnable是什么 1.它是一个接口 2.只提供了run方法 3.这个接口提供了一个协议:实现这个接口的类是active的(不必成为Thread的子类) 4.run方法没有返回值 /* ...

  2. java编程思想-基础

    interface: 方法默认为public:成员变量默认 static and final 对象数组的定义:理解? 多接口继承:可以多个接口,但只有一个具体类,具体类在前面 自:多接口继承时,来自不 ...

  3. 《Java编程思想》读书笔记

    前言 这个月一直没更新,就是一直在读这本<Java编程思想>,这本书可以在Java业界被传神的一本书,无论谁谈起这本书都说好,不管这个人是否真的读过这本书,都说啊,这本书很好.然后再看这边 ...

  4. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

  5. 《Java编程思想》读书笔记(二)

    三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...

  6. 《Java编程思想》读书笔记(三)

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...

  7. 《Java编程思想》读书笔记(五)

    前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...

  8. JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)

    switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...

  9. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  10. 《java编程思想》读书笔记(一)开篇&第五章(1)

    2017 ---新篇章  今天终于找到阅读<java编程思想>这本书方法了,表示打开了一个新世界. 第一章:对象导论 内容不多但也有20页,主要是对整本书的一个概括.因为已经有过完整JAV ...

随机推荐

  1. SqlServer删除复制监视器中无效的发布名称

    原文:SqlServer删除复制监视器中无效的发布名称 在服务器复制监视器中有一个发布名称,因为该发布订阅已经删除. ReportServerTempDB只有一个发布,已无效,打算删除. --直接删除 ...

  2. FMX 动态创建 和 销毁(释放free) 对象

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  3. 简单封装 Delphi 的 DirectX类

    var CreatorRenderer  : TCreatorRenderer; Form1: TForm1; 窗体代码: {$R *.dfm} procedure TForm1.FormCreate ...

  4. 使用SpringMVC框架解决中文乱码的问题

    spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码 问题. 需要在we ...

  5. C#调用Delphi Dll返回字符串的示例(使用Move才能拷贝字符串)

    //----------------------Delphi------------------- procedure GetSqlData(ASource: PChar; ADest: PChar; ...

  6. 【原创】ABAP根据文件路径获取文件所在目录(续)

    在上一篇文章<ABAP根据文件路径获取文件所在目录>中,我主要的思路是采用 “SPLIT dobj AT sep INTO TABLE result_tab” 句型将文件全路径按分隔符“\ ...

  7. 使用Hibernate连接Oracle 无法识别生成的SQL问题

    问题: 在JAVA工程中,数据库使用的是OracleXE(Oracle10g Express Edition). 使用hibernate.reveng.xml创建了实体类及其DAO类,如: tt.my ...

  8. Spring Boot:整合Swagger文档

    综合概述 spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于 ...

  9. Python 爬虫从入门到进阶之路(八)

    在之前的文章中我们介绍了一下 requests 模块,今天我们再来看一下 Python 爬虫中的正则表达的使用和 re 模块. 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网 ...

  10. Spring Framework 组件注册 之 @Import

    Spring Framework 组件注册 之 @Import 写在前面 向spring中注册组件或者叫javaBean是使用spring的功能的前提条件.而且spring也提供了很多种方式,让我们可 ...