热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaserializable序列化机制

1.为什么java对象要序列化?因为对象不可能在jvm中一直存在,内存中序列化的对象就可以将对象保存到其他介质上,比如:硬盘的文件中,也可以进行网络传输,并且反序列化后,

      1.为什么java对象要序列化?

        因为对象不可能在jvm中一直存在,内存中序列化的对象就可以将对象保存到其他介质上,比如:硬盘的文件中,也可以进行网络传输, 并且反序列化后,数据不会丢失,能够完好地得到该对象.

      2.如何序列化?

        像enum枚举是默认实现了serializable接口的,它就可以序列化,所以只要任何类实现了序列化接口,它就可以序列化,注意不要用默认的序列化id=1,这样不能保证反序列化后对象的唯一性,应该使用编译器生成的序列化id.

     3.如果类实现了序列化接口,那它的所有属性都能序列化吗?

       不能,像static静态属性,标识有transient的属性不能序列化


  举个例子:

public class SerializeDemo
{
    public static void main(String[] args)
    {
        File file = new File("serializableObj");

        writeObject(file);

        readObject(file);
    }

    /**
     * @param file
     */
    private static void readObject(File file)
    {
        try
        {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
            Object object = objectInputStream.readObject();
            System.out.println(object);//直接调用该对象的toString()方法
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * @param file
     */
    private static void writeObject(File file)
    {
        try
        {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
            objectOutputStream.writeObject(new Person(111, 222, "zhangshang"));
            objectOutputStream.close();
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

class Person implements Serializable
{

    /**
     *
     */
    private static final long serialVersiOnUID= 2673648647774732782L;
    private int personId; // 注意这里是基本类型
    private Integer personNo;
    private String personName;

    public Person()
    {
        System.out.println("no param constructor invoke");
    }

    public Person(int personId, Integer personNo, String personName)
    {
        this.persOnId= personId;
        this.persOnNo= personNo;
        this.persOnName= personName;
    }

    public int getPersonId()
    {
        return personId;
    }

    public void setPersonId(int personId)
    {
        this.persOnId= personId;
    }

    public String getPersonName()
    {
        return personName;
    }

    public void setPersonName(String personName)
    {
        this.persOnName= personName;
    }

    @Override
    public String toString()
    {
        return new StringBuffer(this.personId).append(this.personName).append(personNo).toString();
    }

    public Integer getPersonNo()
    {
        return personNo;
    }

    public void setPersonNo(Integer personNo)
    {
        this.persOnNo= personNo;
    }

}


执行结果:

zhangshang222

可以看出int类型的值没有被序列化,因为没有输出它的值,甚至连null也没有输出,而Integer,String,这些类类型都直接或者间接地实现了序列化接口。

那可不可以把该类中int给序列化,不行,序列化是对对象而言的。可不可以把可序列化的Integer变成不能序列化,是可以的,加transient关键字,如果想把transient的属性再序列化回来怎么做,一,把transient去掉,二,如下添加两个方法:

  private void writeObject(ObjectOutputStream out) throws IOException
    {
        out.defaultWriteObject();
        out.writeInt(personNo);
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
    {
        in.defaultReadObject();
        persOnNo= in.readInt();
    }


还有另一个序列化接口Externalizable

需要我们自己来实现它里面的两个方法,如果没有作实现,任何可以序列化的对象都不会序列化

像如下实现

class Person implements Externalizable
{

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
    {
        persOnName= (String) in.readObject();
        persOnNo= in.readInt();
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException
    {
        out.writeObject(personName);
        out.writeInt(personNo);
    }

要人工地将需要序列化的对象写进来


推荐阅读
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
Black
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有