java serializable序列化机制

      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);
    }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java序列化机制Java语言中的一种重要机制,它可以将Java对象转换为字节序列,以便在网络上传输或在文件中存储。Java序列化机制由两个部分组成:序列化和反序列化。 1. 序列化 序列化是将Java对象转换为字节序列的过程,这个过程可以通过将对象写入输出流来完成。Java提供了两个主要的序列化类:ObjectOutputStream和ObjectInputStream。 ObjectOutputStream类是用来将Java对象写入输出流的,它可以将Java对象转换为字节序列,并将字节序列写入输出流。序列化的过程中,ObjectOutputStream会将对象的类信息和实例数据都写入输出流中。 2. 反序列化序列化是将字节序列转换为Java对象的过程,这个过程可以通过读取输入流来完成。Java提供了两个主要的反序列化类:ObjectInputStream和ObjectOutputStream。 ObjectInputStream类是用来从输入流中读取字节序列的,并将其转换为Java对象。反序列化的过程中,ObjectInputStream会从输入流中读取对象的类信息和实例数据,并重新创建Java对象。 3. 序列化机制的实现原理 Java序列化机制的实现原理是通过将Java对象转换为字节序列并将其写入输出流中,然后通过读取输入流将字节序列转换为Java对象。 Java序列化机制的实现过程中,所有的类都必须实现Serializable接口。这个接口没有任何方法,只是标识了该类可以被序列化Java序列化机制还需要注意一些问题,比如序列化的版本号、序列化的安全性、序列化的性能等。为了提高序列化的性能,可以使用一些优化技巧,比如使用transient关键字防止某些字段被序列化、使用Externalizable接口替代Serializable接口等。 总之,Java序列化机制Java语言中非常重要的一种机制,它可以实现Java对象的跨平台传输和持久化存储。在开发中,需要注意序列化的版本号、安全性和性能等问题,以确保程序的正确性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值