zoukankan      html  css  js  c++  java
  • serializable的用法(转自百度知道)

    一·
    一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。
    那进行序列化有什么好处呢?
    什么情况下需要序列化 
    a)当你想把的内存中的对象写入到硬盘的时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;
    再稍微解释一下:a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
    b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
    c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。
    没有人说的话能全部准确,批判性的参考。
    二.
    实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。

    实现后如果你用的是工具的话会出来警告,他会提示你,可以自动生成private static final long serialVersionUID = 1L;
    为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义.  
    在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,如对于Test.class可执行如下命令:serialver Test。

    这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。

    不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。
    当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。

    最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。这样可以保证系统的性能和健壮。

    关于serialVersionUID的解释

    serialVersionUID作用:
    序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

    你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式:
    一个是默认的1L,比如:private static final long serialVersionUID = 1L;
    一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。
    Eclipse提示The serializable class XXX does not declare a static final serialVersionUID field of type long
    那是Eclipse提供这个提示功能给你吧.
    你点它warning的icon两下Eclipse就会自动给定.
    如果你不喜欢,可以把它关掉,
    windows -> preferences -> compiler -> Error/Warnings
    -> Potential Programming problems
    将Serializable class without serialVersionUID的warning改成ignore.

    其实如果你没有考虑到兼容性问题时,那就把它关掉吧.
    其实有这个功能是好的.
    只要任何类别实作了Serializable这个介面,
    如果没有加入serialVersionUID,Eclipse都会给你warning提示,
    这个serialVersionUID为了让该类别Serializable後兼容.

    考虑一下,如果今天你的类Serialized存到硬碟里,
    可是後来你却更改了类别的field(增加或减少或改名).
    当你Deserialize时,就会出现Exception.这样就会做成不兼容性的问题.

    但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize.
    这个可以避开不兼容性的问题.

    异常状态:
    The serializable class XXX does not declare a static final serialVersionUID field of type long
  • 相关阅读:
    扒皮下音悦台的“返回顶部”图标效果
    扒皮下京东首页楼层图标的动画效果实现方式
    总结前端开发中的一些特殊规范
    用JS识别各版本浏览器
    各主流浏览器内核介绍
    CSS百分比定义高度的冷知识
    图解js中常用的判断浏览器窗体、用户屏幕可视区域大小位置的方法
    从一个简单例子来理解js引用类型指针的工作方式
    仿京东首页商品分类底部色标随鼠标移动特效
    知乎网首页一个延时交互的小思路
  • 原文地址:https://www.cnblogs.com/speaklessdomore/p/3675083.html
Copyright © 2011-2022 走看看