Serializable序列化----小森见解

serialiazable 有什么用呢,原来一直很迷茫,今天帮同事解决IO问题的时候,才算明白序列的作用。以下例子为小森的个人理解抽象而来,浅陋之处,望各位达人批评指正!
在说明这个问题之前,我们先看一个例子:
场景:领导安排A去写概要设计说明书,并提供摸版。一时间点,A写了70%(还没保存),这时项目有急事,要把A调走,让A要把写文档工作交接给B,这时A有两种选择:
只提供模板,让B从头开始写(创建新的对象)
先保存(实现可序列化)自己写完70%的文档,然后把自己的文档提供给B,让B继续写
不保存(没实现可序列化)自己写完70%的文档,然后把自己的文档提供给B,让B继续写

场景转换成java的语言就是
概要设计说明书模板-----Word
Word A=new Word();
A.do1();
...
A.do7();
//A写完70%


第一种情况代表创建新的对象:
Word B=new Word();
B.do1();
...
B.do7();
//B写完70%
...
B.do10();//写完
//这时我们不难看出浪费了很多系统资源,去做了7步重复的工作
第二种情况代表让A实现可序列化(保存),通过io传给B:
       class Word implements Serializable
{
...
do1();
...
do10();
}

app----->程序入口

    Word A=new Word();
    A.do1();
    ...
    A.do7();
    //A写完70%

    try {
      FileOutputStream out = new FileOutputStream("c://card.out");
      ObjectOutputStream oos = new ObjectOutputStream(out);
      oos.writeObject(A);
      oos.flush();
    } catch (Exception e) {
      System.out.println("Problem serializing: " + e);
    }
    Word B=null;

    try {
      FileInputStream in = new FileInputStream("c://card.out");
      ObjectInputStream ois = new ObjectInputStream(in);
      B = (Word) (ois.readObject());
    } catch (Exception e) {
      System.out.println("Problem serializing: " + e);
    }
//B这时相当于做完了7步了
...
B.do10();//写完
第三种情况代表没有实现可序列化,则

A写入文件时会报错
B最后是NULL

小森点睛:序列化是保存对象状态的方法!
        我们知道对象的基本特征(状态、方法、唯一性),对象是有类实例化出来的,怎么让同一个类的对象的状态一样呢?
class A
1、将地址直接付给对象变量
A a=new A();
      A aa=a;//
2、序列化
3、瞎猫碰见死耗子
 A aaa=new A();
  ....
  

     


以下是小森引用的参考文献内容》》》
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
java.io.Serializable引发的问题——什么是序列化?在什么情况下将类序列化?
  序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
  序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
  是对象永久化的一种机制。
  确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象。这种情况下就要用到对象的序列化。
  只有序列化的对象才可以存储在存储设备上。为了对象的序列化而需要继承的接口也只是一个象征性的接口而已,也就是说继承这个接口说明这个对象可以被序列化了,没有其他的目的。之所以需要对象序列化,是因为有时候对象需要在网络上传输,传输的时候需要这种序列化处理,从服务器硬盘上把序列化的对象取出,然后通过网络传到客户端,再由客户端把序列化的对象读入内存,执行相应的处理。
  对象序列化是java的一个特征,通过该特征可以将对象写作一组字节码,当在其他位置读到这些字节码时,可以依此创建一个新的对象,而且新对象的状态与原对象完全相同。为了实现对象序列化,要求必须能够访问类的私有变量,从而保证对象状态能够正确的得以保存和恢复。相应的,对象序列化API能够在对象重建时,将这些值还原给私有的数据成员。这是对java语言访问权限的挑战。通常用在服务器客户端的对象交换上面,另外就是在本机的存储。
  对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口 。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

按照小森的懒人风格,暂时用的序列方面的内容就这么多,掌控基础后,资料用到了再去查才最有用,在此就不赘述。

最后附一个测试类
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class CardReader {
  public static void main(String[] args) {
    Card3 card = new Card3(10, Card3.SPADES);
    System.out.println("Card to write is: " + card);

    try {
      FileOutputStream out = new FileOutputStream("card.out");
      ObjectOutputStream oos = new ObjectOutputStream(out);
      oos.writeObject(card);
      oos.flush();
    } catch (Exception e) {
      System.out.println("Problem serializing: " + e);
    }

    Card3 acard = null;

    try {
      FileInputStream in = new FileInputStream("card.out");
      ObjectInputStream ois = new ObjectInputStream(in);
      acard = (Card3) (ois.readObject());
    } catch (Exception e) {
      System.out.println("Problem serializing: " + e);
    }

    System.out.println("Card read is: " + acard);

  }
}

class Card3 implements Serializable {
  private int suit = UNASSIGNED;

  private int number = UNASSIGNED;

  public final static int UNASSIGNED = -1;

  public final static int DIAMONDS = 1;

  public final static int CLUBS = 2;

  public final static int HEARTS = 3;

  public final static int SPADES = 4;

  public final static int ACE = 1;

  public final static int KING = 13;

  public Card3(int number, int suit) {
    if (isValidNumber(number)) {
      this.number = number;
    } else {
      //Error
    }

    if (isValidSuit(suit)) {
      this.suit = suit;
    } else {
      //Error
    }
  }

  public int getSuit() {
    return suit;
  }

  public int getNumber() {
    return number;
  }

  public static boolean isValidNumber(int number) {
    if (number >= ACE && number <= KING) {
      return true;
    } else {
      return false;
    }
  }

  public static boolean isValidSuit(int suit) {
    if (suit >= DIAMONDS && suit <= SPADES) {
      return true;
    } else {
      return false;
    }
  }

  public boolean equals(Object obj) {
    if (obj instanceof Card3) {
      Card3 card = (Card3) obj;
      if (card.getNumber() == this.number && card.getSuit() == this.suit) {
        return true;
      } else {
        return false;
      }
    } else {
      return false;
    }
  }

  public int hashCode() {
    return number * suit;
  }

  public String toString() {
    return numberToString(this.number) + " of " + suitToString(this.suit);
  }

  public static String numberToString(int number) {
    String result = "";
    switch (number) {
    case ACE:
      result = "Ace";
      break;
    case 2:
      result = "Two";
      break;
    case 3:
      result = "Three";
      break;
    case 4:
      result = "Four";
      break;
    case 5:
      result = "Five";
      break;
    case 6:
      result = "Six";
      break;
    case 7:
      result = "Seven";
      break;
    case 8:
      result = "Eight";
      break;
    case 9:
      result = "Nine";
      break;
    case 10:
      result = "Ten";
      break;
    case 11:
      result = "Jack";
      break;
    case 12:
      result = "Queen";
      break;
    case KING:
      result = "King";
      break;
    case UNASSIGNED:
      result = "Invalid Number";
      break;
    }
    return result;
  }

  public static String suitToString(int suit) {
    String result = "";
    switch (suit) {
    case DIAMONDS:
      result = "Diamonds";
      break;
    case CLUBS:
      result = "Clubs";
      break;
    case HEARTS:
      result = "Hearts";
      break;
    case SPADES:
      result = "Spades";
      break;
    case UNASSIGNED:
      result = "Invalid Suit";
      break;
    }
    return result;
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值