• java笔记九:对象序列化与反序列化


      在java程序运行过程中,有许多的对象同时存在,但是程序结束运行或者JVM停止运行时这些对象都会消失。如何将这些对象保存起来以便下一次再将这些对象读入内存呢?或者如何将某些对象通过网络传到另一端的java程序?实施对象的这种操作叫做对象的序列化(或者叫做持久化),重新读入内存叫做反序列化。

      基本数据类型的包装类和所有容器类都可以被序列化。用户自定义的类默认是不可以被序列化的。如果想要自己定义的类可以序列化就必须让这个类实现java.io.Serializable接口。

    下面看一个Demo:

     1 package com.serializable;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.FileNotFoundException;
     5 import java.io.FileOutputStream;
     6 import java.io.IOException;
     7 import java.io.ObjectInputStream;
     8 import java.io.ObjectOutputStream;
     9 import java.io.Serializable;
    10 
    11 class Point implements Serializable{
    12     private int x;
    13     private int y;
    14     private transient int z;  //用关键字transient修饰的属性不能参与序列化的过程
    15     public Point(int x,int y,int z) {
    16         this.x = x;
    17         this.y = y;
    18         this.z = z;
    19     }
    20     @Override
    21     public String toString() {
    22         return "(" + x + "," + y + "," + z + ")";
    23     }
    24 }
    25 
    26 public class ObjectSerializableDemo {
    27     
    28     
    29     public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
    30         String fileName = "F:\\shar\\test\\test7.txt";
    31         //将二进制文件转换成一个对象输出流
    32         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
    33         for (int i = 0; i < 10; i++) {
    34             oos.writeObject(new Point(i,2*i,3*i));
    35         }
    36         oos.flush();
    37         oos.close();
    38         
    39         ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
    40         for (int i = 0; i < 10; i++) {
    41             Point p = (Point)ois.readObject();
    42             System.out.println(p + " ");
    43         }
    44         ois.close();
    45     }
    46 
    47 }

    运行结果:
    (0,0,0)
    (1,2,0)
    (2,4,0)
    (3,6,0)
    (4,8,0)
    (5,10,0)
    (6,12,0)
    (7,14,0)
    (8,16,0)
    (9,18,0)

      从运行结果可以看出,所有Piont类对象的z属性都没有被序列化。应为它被一个关键字transient修饰了,被这个关键字修饰的属性是不参与持久化的。

  • 相关阅读:
    hdoj 6023 Automatic Judge
    hdoj 1170 Balloon Comes!
    初识vim操作和配置
    POJ 1611 The Suspects (并查集)
    HDU 1232 畅通工程 (并查集)
    计蒜客--两数之和
    计蒜客--爬楼梯 (动态规划)
    计蒜客--单独的数字 (位运算)
    计蒜客--最后一个单词的长度
    计蒜客-- 奇怪的国家 (位运算)
  • 原文地址:https://www.cnblogs.com/liuling/p/serializable.html
Copyright © 2020-2023  润新知