`
soleghost
  • 浏览: 41831 次
  • 性别: Icon_minigender_1
  • 来自: 未知
社区版块
存档分类
最新评论

java序列化总结

阅读更多

1.Serializable接口

只是一个表识接口,仅仅是告诉jvm这是一个可以序列化的接口。


2.serialVersionUID

只要这个UID的值不变,在序列化的版本中增加属性或者减少属性就不会报错;否则当版本变更后,再反序列会报错;
如果自己不定义,每次在编译的时候,编译器会自动生成一个值,但是不能保证每次编译时的值都一样,所以务必自己定义!

 

3.readResolve、readObject、writeReplace、writeObject接口

 

public class FooImpl implements java.io.Serializable{    
    private String message;    
   
    public String getFoo() {            
        return message;    
    }    
   
    public void setMessage(String message) {    
        this.message = message;    
    }    
   
    private void writeObject(java.io.ObjectOutputStream out) throws IOException {    
        System.out.println("writeObject invoked");    
        out.writeObject(this.message == null ? "hohohahaha" : this.message);    
    }    
   
    private void readObject(java.io.ObjectInputStream in) throws IOException,    
            ClassNotFoundException {    
        System.out.println("readObject invoked");    
        this.message = (String) in.readObject();    
    }    
   
    private Object writeReplace() throws ObjectStreamException {    
        System.out.println("writeReplace invoked");    
        return this;    
    }    
   
    private Object readResolve() throws ObjectStreamException {    
        System.out.println("readResolve invoked");    
        return this;    
    }    
   
    public Object serialize() throws IOException, ClassNotFoundException {    
        ByteArrayOutputStream baos = new ByteArrayOutputStream();    
        ObjectOutputStream oos = new ObjectOutputStream(baos);    
        oos.writeObject(this);    
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());    
        ObjectInputStream ois = new ObjectInputStream(bais);    
        return ois.readObject();    
    }    
         public static void main(String[] args) throws IOException,     
              ClassNotFoundException {    
                  FooImpl fooimpl = new FooImpl();    
                  fooimpl.serialize();    
    }    
}   

 

我们运行这段代码看到的debug信息:
writeReplace invoked (序列化时调用)
writeObject invoked (序列化时调用)
readObject invoked (反序列化时调用)
readResolve invoked(反序列化时调用)

4.Externalizable

Externalizable 是一个有实际方法需要实现的interface,包括writeExternal和readExternal,是Serializable接口的子接口:

  1.    public class FooImpl implements java.io.Externalizable {   
  2.     private String message;   
  3.   
  4.     public String getFoo() {   
  5.         return message;   
  6.     }   
  7.   
  8.     public void setMessage(String message) {   
  9.         this.message = message;   
  10.     }   
  11.   
  12.     private Object writeReplace() throws ObjectStreamException {   
  13.         System.out.println("writeReplace invoked");   
  14.         return this;   
  15.     }   
  16.   
  17.     private Object readResolve() throws ObjectStreamException {   
  18.         System.out.println("readResolve invoked");   
  19.         return this;   
  20.     }   
  21.   
  22.     public Object serialize() throws IOException, ClassNotFoundException {   
  23.         ByteArrayOutputStream baos = new ByteArrayOutputStream();   
  24.         ObjectOutputStream oos = new ObjectOutputStream(baos);   
  25.         oos.writeObject(this);   
  26.         ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());   
  27.         ObjectInputStream ois = new ObjectInputStream(bais);   
  28.         return ois.readObject();   
  29.     }   
  30.   
  31.     public void readExternal(ObjectInput arg0) throws IOException,   
  32.             ClassNotFoundException {   
  33.         System.out.println("readExternal invoked");   
  34.         Object obj = arg0.readObject();        
  35.     }   
  36.   
  37.     public void writeExternal(ObjectOutput arg0) throws IOException {   
  38.         System.out.println("writeExternal invoked");   
  39.         arg0.writeObject("Hello world");   
  40.     }   
  41.          public static void main(String[] args) throws IOException,    
  42.               ClassNotFoundException {   
  43.                   FooImpl fooimpl = new FooImpl();   
  44.                   fooimpl.serialize();   
  45.     }   
  46. }  

我们运行这段代码看到的debug信息:
writeReplace invoked
writeExternal invoked
readExternal invoked
readResolve invoked
在此writeExternal 和readExternal 的作用与writeObject和readObject 一样.

最后,当我们同时实现了两个interface的时候,JVM只运行Externalizable 接口里面的writeExternal 和readExternal 方法对序列化内容进行处理.
需要注意的是:Serializable是一个真正的mark interface,
writeObject,readObject, writeReplace,readResolve是直接与JVM通信,告诉JVM序列化的内容.

分享到:
评论

相关推荐

    java序列化全解

    Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...

    java反序列化工具

    Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    java 序列化时排除指定属性

    Java序列化是Java平台提供的一种持久化机制,它允许我们将一个Java对象转换为字节流,以便存储到磁盘上,或者通过网络进行传输。这使得我们可以保存和恢复对象的状态。实现序列化的类需要实现`Serializable`接口,...

    java 序列化代码示例

    总结,Java序列化是一个强大的工具,但使用时需注意其潜在的风险和性能影响。理解序列化的工作原理,并合理运用,可以在许多场景下提高软件的灵活性和可维护性。在实际项目中,结合淘宝等大型系统的具体需求,序列化...

    java序列化(Serializable)的作用和反序列化

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

    java序列化原理与算法

    ### Java序列化原理与算法详解 #### 序言 在现代软件开发中,尤其是在网络通信和数据持久化领域,对象的序列化与反序列化扮演着至关重要的角色。Java作为一种广泛应用的编程语言,提供了强大的内置支持来实现序列化...

    C#和Java的序列化反序列化

    总结来说,C#和Java的序列化和反序列化机制都是各自语言中不可或缺的一部分,它们使得数据能够在不同环境之间自由流动。理解和掌握这些技术对于任何软件开发者来说都是非常重要的,特别是涉及到数据持久化、网络通信...

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项...总结,Java对象的序列化和反序列化是Java编程中的基础概念,它涉及到数据持久化、网络通信等多个方面。理解并熟练运用这一技术,能够帮助开发者更有效地管理和传递数据。

    java serializable 序列化与反序列化

    **一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换为可以存储或传输的数据格式的过程。在Java中,通常是将对象转换为字节数组,以便写入磁盘或通过网络发送。 2. **为什么需要...

    java自动序列化

    Java序列化是将对象转换为字节流的过程,目的是为了保存对象的状态以便稍后恢复或传输到其他地方。通过实现`Serializable`接口,一个Java对象就可以被序列化。这个接口是一个标记接口,没有定义任何方法,仅表示对象...

    通过实例深入了解java序列化

    通过实例深入了解 Java 序列化 Java 序列化是 Java 系列技术中一个较为重要的技术点,用于将 Java 对象序列化为二进制文件。开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ObjectInputStream 和...

    java对象序列化.ppt

    总结来说,Java对象序列化是将对象状态转换为字节流,便于存储和网络传输的关键技术。通过实现`Serializable`或`Externalizable`接口,我们可以控制对象如何被序列化和反序列化,同时`transient`关键字提供了保护...

    java序列化与反序列化

    Java序列化是将Java对象转换为字节流的过程,以便可以在磁盘、数据库或网络上存储或传输这些对象。这使得我们能够保存对象的状态,并在稍后的时间点恢复它,或者在网络之间传递对象。反序列化是相反的过程,即从字节...

    Java对象序列化的秘密

    总结,Java对象序列化是一种强大但需要谨慎使用的工具。了解其原理和注意事项,可以帮助开发者充分利用这一特性,同时避免潜在的问题。在实际应用中,要权衡序列化的优点和可能带来的安全、性能挑战,选择最适合项目...

    Netty中的java序列化

    总结起来,Netty中的Java序列化是通过实现`Serializable`接口的对象转换为字节流,然后使用`ByteBuf`在网络中传输的一种方式。在实际开发中,我们可以根据性能需求选择合适的序列化策略,并结合Netty的强大功能,...

    Java序列化的机制和原理

    ### Java序列化的机制和原理 #### 一、序列化与反序列...总结来说,Java序列化机制提供了对象序列化和反序列化的能力,使得对象可以跨网络传输或存储于磁盘上。理解序列化的原理对于开发基于网络的应用程序尤其重要。

    Java Json序列化与反序列化

    总结,Java中的JSON序列化与反序列化是数据交互的重要环节,Jackson和Gson是两个常用的库,它们提供了丰富的功能和良好的API设计,使得处理JSON数据变得简单高效。通过理解和掌握这些知识,开发者可以更好地在Java...

    克隆和序列化(Java )

    在Java编程语言中,克隆和序列化是两个...总结来说,Java中的克隆和序列化是两个强大的工具,它们在数据持久化、对象复制以及网络通信等方面有着广泛的应用。理解和熟练掌握这两个概念,对于Java开发者来说至关重要。

Global site tag (gtag.js) - Google Analytics