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,如需转载请自行联系原作者
  • 目录
    相关文章
    |
    1月前
    |
    存储 缓存 安全
    Java内存模型深度解析:从理论到实践####
    【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
    39 6
    |
    1月前
    |
    设计模式 Java 开发者
    Java中的异常处理:理解与实践
    【10月更文挑战第42天】在Java的世界中,异常处理是每个开发者必须面对的挑战。它就像是一场不可预知的风暴,可能会在任何时候突然降临,打乱我们的计划。但是,如果我们能够掌握正确的处理方法,这场风暴也可以变成推动我们前进的力量。本文将带你深入理解Java中的异常处理机制,通过代码示例,我们将一起学习如何捕获、处理和预防异常,让你的程序在面对任何挑战时都能保持稳健和优雅。
    |
    1月前
    |
    Arthas 监控 Java
    拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
    本文介绍了阿里云 Java Agent 4.x 版本在基于 OTel Java Agent 二次开发过程中的实践与思考,并重点从功能、性能、稳定性、兼容性四个方面介绍了所做的工作。同时也介绍了阿里云可观测团队积极参与开源建设取得的丰厚成果。
    222 7
    拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
    |
    28天前
    |
    存储 监控 小程序
    Java中的线程池优化实践####
    本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
    |
    27天前
    |
    安全 Java 数据库连接
    Java中的异常处理:理解与实践
    在Java的世界里,异常处理是维护代码健壮性的守门人。本文将带你深入理解Java的异常机制,通过直观的例子展示如何优雅地处理错误和异常。我们将从基本的try-catch结构出发,探索更复杂的finally块、自定义异常类以及throw关键字的使用。文章旨在通过深入浅出的方式,帮助你构建一个更加稳定和可靠的应用程序。
    31 5
    |
    30天前
    |
    缓存 Java 开发者
    Java多线程并发编程:同步机制与实践应用
    本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
    133 6
    |
    27天前
    |
    安全 Java 程序员
    Java内存模型的深入理解与实践
    本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
    |
    30天前
    |
    安全 Java 开发者
    Java中的多线程编程:从基础到实践
    本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
    61 1
    |
    1月前
    |
    安全 Java 编译器
    Java对象一定分配在堆上吗?
    本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
    Java对象一定分配在堆上吗?
    |
    1月前
    |
    Java 开发者
    Java多线程编程的艺术与实践####
    本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####