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. Python杂谈: __init__.py的作用

    我们经常在python的模块目录中会看到 "__init__.py"  这个文件,那么它到底有什么作用呢? 1. 标识该目录是一个python的模块包(module package ...

  2. System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。

    今天在写导入Excel表格的代码,运行时却报异常,异常信息: System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0 ...

  3. Oracle报错:不是GROUP BY 表达式

    报错:不是GROUP BY 表达式 实例:select sum(hwjz),rq from JcChargeInfo where 1=1  group by rq order by jcchargec ...

  4. kafka 遇到的错

    D:\cluster\kafka_2.->.\bin\windows\kafka-topics.bat --create --zookeeper localhost: --replication ...

  5. 比较DirectX和OpenGL的区别(比较详细)

    OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库.OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL.IRIS GL是一个工业标准的3D图形软件接口,功能虽然 ...

  6. 通过OSG实现对模型的日照模拟

    目录 1. 加载模型 2. 光照 1) 环境反射 2) 漫反射 3) 日照方向 (1) 太阳高度角和太阳方位角 (2) 计算过程 4) 改进实现 3. 阴影 4. 太阳高度角与太阳方位角的计算 1) ...

  7. Zookeeper详解-工作流和leader选举(三)

    一.工作流 一旦ZooKeeper集合启动,它将等待客户端连接.客户端将连接到ZooKeeper集合中的一个节点.它可以是leader或follower节点.一旦客户端被连接,节点将向特定客户端分配会 ...

  8. (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例

    原生js实现放烟花效果,点击鼠标,然后随机向四周扩散,! 思路: 1.首先烟花是五颜六色的,所以我们先写一个随机颜色的函数: 2.创建一个制造烟花的构造函数,第一个参数为元素,第二参数为初始x轴位置, ...

  9. 【转载】tomcat原理

    转载地址:https://blog.csdn.net/u014795347/article/details/52328221?locationNum=2&fps=1 以下代码纯属本人复制,而且 ...

  10. PATB 1041 考试座位号(15)

    #include <cstdio> #include <iostream> using namespace std; struct student{ char str[15]; ...