java对象序列化java.io.Serializable 接口实践

简介:

java.io.Serializable 接口没有任何方法和字段,仅仅表示实现它的类的对象可以被序列化。实现了这个接口的所有类及其子类都可以对象序列化。 
序列化前,虚拟机要清楚每个对象的结构,所以序列化会比较慢,如果关心性能或者需要读取大量的特定的类对象,可以使用 java.io.Externalizable接口 
对象序列化一般出现在如下的环境下: 
把对象的字节序列保存在物理存储介质中(如硬盘文件); 
把对象的字节序列经网络传输给请求者; 

序列过程的特殊处理: 
private void writeObject(java.io.ObjectOutputStream out)     throws IOException private void readObject(java.io.ObjectInputStream in)  throws IOException, ClassNotFoundException; 
当ObjectOutputStream对一个对象开始序列化/反序列化时,如果该对象类具有了方法writeObject()/readObject(),就执行该方法,否则执行默认方法defaultWriteObject()/defaultReadObject(). 
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException; 
在做序列化前,用另一个可序列化对象替代该序列化对象,然后进行序列化(调用defaultWriteObject()或者 
writeObject())方法完成序列化操作。 

不序列化的状态: 
对对象的静态的或瞬时的(transient)成员,不会进行序列化。 

serialVersionUID 版本号: 
序列化serialVersionUID 的版本号在反序列化时,用于标志序列化的发送者和接受者是否为该对象加载了与序列化是相兼容的类,如果不兼容(serialVersionUID 不相同),会导致InvalidClassException 。如果类没有显示的声明serialVersionUID,序列化是会计算默认的值。默认值在不同编译器中的结果肯能不同,为了能更好的跨平台,最好显示的声明它。 
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 

实例练习: 
Java代码 

  • public class SerialTest {  
  •       
  •     public static void main(String[] args){  
  •         Customers customer = new Customers();  
  •         try {  
  •             FileOutputStream file = new FileOutputStream("customer.obj");  
  •             ObjectOutputStream out = new ObjectOutputStream(file);  
  •             out.writeObject(customer);  
  •               
  •             System.out.println(file.getFD().toString());  
  •             file.close();  
  •             out.close();  
  •               
  •             FileInputStream fileIN = new FileInputStream("customer.obj");  
  •             ObjectInputStream in = new ObjectInputStream(fileIN);  
  •             try {  
  •                 Customers cus = (Customers)in.readObject();  
  • /*这里虽然可以打印出静态变量,但不是因为对它进行了序列化,而是因为静态变量自身的特性造成的*/  
  •                 System.out.println(cus.toString());  
  •             } catch (ClassNotFoundException e) {  
  •                 e.printStackTrace();  
  •             }  
  •         } catch (FileNotFoundException e) {  
  •             e.printStackTrace();  
  •         } catch (IOException e) {  
  •             e.printStackTrace();  
  •         }  
  •     }  
  • }  
  •   
  • class Customers implements Serializable{  
  •     private static final long serialVersionUID = 167L;  
  •       
  •     private String name = "aq";  
  •     private int old = 45;  
  •     private String address = "SuZhou JiangSu China";  
  •     private transient String alias = "aaq";  
  •     private static String alisa1 = "aaaq";  
  •       
  •     private void writeObject(ObjectOutputStream out)throws IOException{        
  •         this.old = 55;  
  •         out.defaultWriteObject();  
  •     }  
  •       
  •     private void readObject(java.io.ObjectInputStream in)throws IOException, ClassNotFoundException{  
  •         in.defaultReadObject();  
  •         this.old = this.old + 5;          
  •     }  
  •       
  •     public String toString(){  
  •         StringBuilder builder = new StringBuilder(128);  
  •         builder.append("\r\\r\\r\\r\nalisa1=").append(alisa1);  
  •         return builder.toString();  
  •     }
  • }


  • 本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2010/12/20/1911925.html,如需转载请自行联系原作者
  • 目录
    相关文章
    |
    10月前
    |
    算法 安全 Java
    除了类,Java中的接口和方法也可以使用泛型吗?
    除了类,Java中的接口和方法也可以使用泛型吗?
    278 11
    |
    9月前
    |
    JSON 网络协议 安全
    【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
    几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
    429 1
    |
    9月前
    |
    Java Go 开发工具
    【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
    抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
    359 1
    |
    9月前
    |
    Java Unix Go
    【Java】(8)Stream流、文件File相关操作,IO的含义与运用
    Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
    341 1
    |
    9月前
    |
    JSON 网络协议 安全
    【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
    几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
    395 1
    |
    11月前
    |
    存储 缓存 安全
    Java集合框架(二):Set接口与哈希表原理
    本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
    1312 23
    |
    11月前
    |
    Java 测试技术 API
    Java IO流(二):文件操作与NIO入门
    本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
    |
    11月前
    |
    SQL Java 数据库连接
    Java IO流(一):字节流与字符流基础
    本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
    |
    存储 Java
    【IO面试题 四】、介绍一下Java的序列化与反序列化
    Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
    |
    Java 大数据
    解析Java中的NIO与传统IO的区别与应用
    解析Java中的NIO与传统IO的区别与应用