zoukankan      html  css  js  c++  java
  • 什么是Java序列化,如何实现java序列化

    简要解释:
      
    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
      序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,
    然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

    详细解释:

          当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

      只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包

    1.概念

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

    2.用途

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

    3.对象序列化

    序列化API

      java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。

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

    代码示例

    复制代码
     1 import java.io.*;
     2 import java.util.Date;
     3 
     4 public class ObjectSaver {
     5     public static void main(String[] args) throws Exception {
     6         /*其中的  D:\objectFile.obj 表示存放序列化对象的文件*/
     7 
     8         
     9         //序列化对象
    10         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\objectFile.obj"));
    11         Customer customer = new Customer("王麻子", 24);    
    12         out.writeObject("你好!");    //写入字面值常量
    13         out.writeObject(new Date());    //写入匿名Date对象
    14         out.writeObject(customer);    //写入customer对象
    15         out.close();
    16 
    17         
    18         //反序列化对象
    19         ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\objectFile.obj"));
    20         System.out.println("obj1 " + (String) in.readObject());    //读取字面值常量
    21         System.out.println("obj2 " + (Date) in.readObject());    //读取匿名Date对象
    22         Customer obj3 = (Customer) in.readObject();    //读取customer对象
    23         System.out.println("obj3 " + obj3);
    24         in.close();
    25     }
    26 }
    27 
    28 class Customer implements Serializable {
    29     private String name;
    30     private int age;
    31     public Customer(String name, int age) {
    32         this.name = name;
    33         this.age = age;
    34     }
    35 
    36     public String toString() {
    37         return "name=" + name + ", age=" + age;
    38     }
    39 }
    复制代码

    执行结果

    4.说明

      读取对象的顺序与写入时的顺序要一致

      对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态非静态字段的值。

  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/wangjintao-0623/p/9598908.html
Copyright © 2011-2022 走看看