`
lg_asus
  • 浏览: 183708 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java序列化Serializable和Externalizable

 
阅读更多
Serializable是二进制位为基础保存的,可以没有任何构造方法。
Externalizable必须要手动提供一个public no-arg构造方法,否则会报错!
transient表示变量不被序列化,但是如果一个类实现Externalizable在writeObject()仍然把transient变量序列了,是可以成功的。这就失去了transient的意义!

实现Serializable也可以自定义序列化。
要有
private void writeObject(ObjectOutputStream stream) throws IOException;

private void readObject(ObjectInputStream stream)throws IOException, ClassNotFoundException

这两个方法,其中这两个方法分别是在ObjectOutputStream和ObjectInputStream中被调用,且是同名方法,在ObjectOutputStream和ObjectInputStream中还有defaultWriteObject和defaultReadObject两个方法用于对非transient变量的序列化与反序列化。

还有一种特殊的情况:序列化单例和类型安全的枚举。

在jdk5.0以前,Enum还未出现,这时一个类中会有私有构造方法来创建多个枚举值,如下

public class Orientation implements Serializable{
  private int value ;
  private Orientation(int i){
    value = i;
   }

   public static final Orientation HORIZONTAL = new Orientation(1);
   public static final Orignetation VERTICAL = new Orientation(2);
}

构造器是私有的,那么在这个类外就不可能会出现除HORIZONTAL和 VERTICAL的其它枚举值,因此可以用==来进行比较 ,但是在序列化和反序列化(即使构造器是私有的也可以反序列化),那么反序列化后的value和原先的HORIZONTAL和VERTICAL不能再用==比较了,因此这里就会有问题。
这时就需要再用一个方法  protected Object readResolve() throws ObjectStreamException{
   if(value == 1){
        return Orientation.HORIZONTAL;
    }
    if(value == 2){
        return Orientation.VERTICAL;
     }
     return null;// this should not happen
}

在readObject()后面调用,将反序列化后的对象用另一个对象替换。还有一个writeReplace()方法是在writeObject()前调用,将一个对象替换成另一个对象进行序列化。
分享到:
评论

相关推荐

    JAVA序列化Serializable及Externalizable区别详解

    主要介绍了JAVA序列化Serializable及Externalizable区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java 串行化(序列化)Serializable/Externalizable

    NULL 博文链接:https://zhycaf.iteye.com/blog/982092

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ObjectOutputStream ObjectInputStream Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第7页。...

    Java 对象序列化详解以及实例实现和源码下载

    Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...

    Java中的序列化与反序列化.pdf

    Serializable接口和Externalizable接口实现序列化和反序列化

    xml的序列化与验证

    1、xml序列化的Java3种实现方法 1)Serializable和Externalizable接口Xstream框架2)Simple框架 3)Apache的AXIOM框架 2、XML验证文档的生成工具 trang.jar 3、利用XSD文件的XML3种验证方法 1)Dom4j的SAXValidator ...

    java序列化和反序列化,面试必备

    最近阅读Serializable接口和Externalizable接口的源码,并结合了一些资料,对面试过程中与序列化相关的内容做了一些总结。 一、序列化、反序列化、使用场景、意义。 序列化:将对象写入IO流中; 反序列化:从IO流中...

    深入探索Java对象的序列化

    Serializable有一个子接口Externalizable,实现Externalizable接口的类可以自行控制对象序列化荷反序列化过程。 一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果...

    groovy-io:与JSON格式之间完美的Groovy序列化。 此外,还支持JSON的精美打印(与jsonEditorOnline样式匹配)

    Groovy-io 往返于JSON格式的完美序列化(可在)。 要包含在您的项目中: ... <artifactId>groovy-io <version>1.1.3 groovy-io由两个主要类组成,一个... groovy-io不需要类实现Serializable或Externalizable来进

    JDK_API_1_6

    Externalizable Externalizable 实例类的唯一特性是可以被写入序列化流中,该类负责保存和恢复实例内容。 FileFilter 用于抽象路径名的过滤器。 FilenameFilter 实现此接口的类实例可用于过滤器文件名。 ...

Global site tag (gtag.js) - Google Analytics