zoukankan      html  css  js  c++  java
  • 对象序列化与反序列化

    1)要想让一个对象成为序列化对象,那么这个类就要实现Serializable或Externalizable接口(Externalizable接口继承与Serializable接口),

    这种序列化仅对对象的 非transient 的实例变量进行序列化不会对静态成员变量序列化,也不会对方法序列化

    2)

    对象序列化:把java“对象”转换成“字节序列”的过程称为对象序列化

    对象反序列化:把“字节序列”恢复成java“对象”的过程称为反序列化

    在反序列化时不会调用类的任何构造方法

    3)

    对象序列化的功能描述:

    1.把对象转换成字节的方式存到硬盘上去,通常存放在一个文件中,当你打开这个文件时有点乱码,但也可以看到相应信息

    2.在网络上传递对象的字节序列

    具体例子:

    [java] view plain copy
    1. import java.io.Serializable ;  
    2. import java.io.ObjectOutputStream ;  
    3. import java.io.FileOutputStream ;  
    4. import java.io.* ;  
    5.   
    6. //对象序列化 与 反序列化  
    7.   
    8. public class SerializableTest  
    9. {  
    10.     public static void main(String[] args)  
    11.     {  
    12.         Person p = new Person("小明",20,172.0) ;  
    13.         Person p2 = new Person("小红",19,165.0) ;  
    14.         Person p3 = new Person("小花",21,168.0) ;  
    15.         try  
    16.         {  
    17.             FileOutputStream fos = new FileOutputStream("e:/abc/person.txt") ;  
    18.             //实现对象序列化,把对象以 字节流的方式 写进文件中  
    19.             ObjectOutputStream oos = new ObjectOutputStream(fos) ;  
    20.             //对象序列化 只可以把 ”非静态的成员变量“写到流中,静态的成员变量;或者方法都不可以写到流中  
    21.             oos.writeObject(p);  
    22.             oos.writeObject(p2);  
    23.             oos.writeObject(p3);  
    24.   
    25.             oos.close() ;  
    26.               
    27.             //反序列化,把文件中的对象写回到程序(内存)中  
    28.             FileInputStream fis = new FileInputStream("e:/abc/person.txt") ;  
    29.             ObjectInputStream ois = new ObjectInputStream(fis) ;  
    30.   
    31.             Person pe1 = (Person)ois.readObject() ;  
    32.             Person pe2 = (Person)ois.readObject() ;  
    33.             Person pe3 = (Person)ois.readObject() ;  
    34.   
    35.             System.out.println(pe1.name+", " + pe1.age + ", " + pe1.height);  
    36.             System.out.println(pe2.name+", " + pe2.age + ", " + pe2.height);  
    37.             System.out.println(pe3.name+", " + pe3.age + ", " + pe3.height);  
    38.   
    39.             ois.close() ;  
    40.               
    41.         }  
    42.         catch (Exception e)  
    43.         {  
    44.             e.printStackTrace() ;  
    45.         }  
    46.           
    47.   
    48.     }  
    49. }  
    50.   
    51. class Person implements Serializable //该对象实现了Serializable接口,则该类是序列化对象  
    52. {  
    53.     String name ;  
    54.     int age ;  
    55.     double height ;  
    56.   
    57.     public Person(String name, int age, double height)  
    58.     {  
    59.         this.name = name ;  
    60.         this.age = age ;  
    61.         this.height = height ;  
    62.     }  
    63. }  

    如果用户希望控制类的序列化方式,可以在可序列化类中提供以下形式的writeObject()和readObject()方法,可以参考api。

    private void writeObject(java.io.ObjectOutputStream out) throws IOException
    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException

  • 相关阅读:
    Socket网络编程--简单Web服务器(4)
    GCC学习笔记
    字符分隔符'1'(u0001)的困惑
    g++编译时遇到问题undefined reference to
    ROS学习笔记(三)
    cJSON笔记
    ROS学习笔记(二)
    ROS学习笔记(一)
    ffmpeg推流方式采用TCP协议
    Android OS的image文件组成
  • 原文地址:https://www.cnblogs.com/hoobey/p/5294302.html
Copyright © 2011-2022 走看看