java中的Serializable、transient关键字详解

 更新时间:2023年09月28日 10:35:42   作者:BeanInJ  
这篇文章主要介绍了java中的Serializable、transient关键字详解,序列化只会保存属性值,不会保存方法,通过反序列化可以把序列化后的内容恢复成对象,需要的朋友可以参考下

1、Serializable 序列化接口

如下,写一个类实现Serializable,并标注序列化版本号

public class  Foo implements Serializable  { 
	private static final long serialVersionUID = -5809782578272943999L;
	private int id;
	private String name;
	.
	.
	.
}

实现序列化接口Serializable有什么用?

1.1、有什么用?

没有实现序列化的对象都保存在堆(Heap)中。 实现序列化后可以保存到一个文件里。

如下例:

// class  Foo implements Serializable
Foo foo = new Foo();
foo.setId(1);  
foo.setName("ho"); 
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("foo.ser"));
oos.writeObject(student);
oos.flush();
oos.close();

foo实例化后被保存在foo.ser文件中

foo.ser

Foo [id=1, name=ho]

1.2、什么情况下用?

1、该对象数据需要写入数据库

2、该对象需要通过网络、RMI、缓存等传递或保存

3、该对象需要在jvm与jvm间交流

1.3、要注意些什么

1、序列化只会保存属性值,不会保存方法

2、通过反序列化可以把序列化后的内容恢复成对象

3、声明为 static 和 transient 的成员变量,不能被序列化,static 成员变量是描述类级别的属性,transient 表示临时数据。

4、某个类可以被序列化,则其子类也可以被序列化

5、反序列化读取序列化对象的顺序要保持一致

2、transient 关键字

如下是LinkedList的部分源码

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    transient int size = 0;
    transient Node<E> first;
    .
    .
    .
 }

我们能看到size、first两个属性前面加了transient关键字。 transient 关键字,主要用来忽略我们不希望进行序列化的变量。

2.1、什么情况下用?

首先,当一个类需要序列化,但是某个属性不需要被序列化就可以加此关键字。 都有哪些场景呢?

1、一些敏感信息,如密码、银行卡号等

2、非必要信息,如LinkedList中的大小、位置等

2.2、要注意些什么

1、需要实现Serializable接口。

2、transient关键字只能修饰变量,而不能修饰方法和类。

3、本地变量是不能被transient关键字修饰的

4、实现Externalizable接口,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。

3、序列化与反序列化

ObjectOutputStream:IO 类,包含序列化对象的方法,writeObject()

ObjectInputStream:IO 类,包含反序列化对象的方法,readObject()

序列化示例:

public static void main(String[] args) throws Exception {
    //  创建 Java 对象(Foo必须已经实现了Serializable接口)
    Foo foo = new Foo(22,"tt");
    //  对象输出流
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("foo"));
    // 使用 writeObject 序列化对象
    oos.writeObject(student);
    // 刷新
    oos.flush();
    //  关闭流
    oos.close();
}

反序列化示例:

public static void main(String[] args) throws Exception {
    //  对象输入流
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("foo"));
    //  使用 readObject() 反序列化  
    Object obj = ois.readObject();
    //  使用对象
    System.out.println(obj);
    //  关闭流
    ois.close();
}

反序列化需要借助文件输入流读取指定路径的二进制文件。

3.1、serialVersionUID 版本号的作用

JVM 首先会通过类名来区分 Java 类,类名不同,则不是同一个类。当类名相同时,JVM 就会通过序列化版本号来区分 Java 类,如果序列化版本号相同就为同一个类,序列化版本号不同就为不同的类。

到此这篇关于java中的Serializable、transient关键字详解的文章就介绍到这了,更多相关java的Serializable、transient内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解如何有效地处理Java中的多线程

    详解如何有效地处理Java中的多线程

    在现代软件开发中,多线程编程已成为提高程序性能和响应速度的重要手段,Java提供了丰富的多线程支持,使得在Java中实现并发操作变得相对简单,本文将深入探讨Java多线程编程的基本概念、常见问题和最佳实践,需要的朋友可以参考下
    2024-06-06
  • SpringBoot服务开启后通过端口访问无反应的解决

    SpringBoot服务开启后通过端口访问无反应的解决

    这篇文章主要介绍了SpringBoot服务开启后通过端口访问无反应的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java 超详细讲解对象的构造及初始化

    Java 超详细讲解对象的构造及初始化

    面向对象乃是Java语言的核心,是程序设计的思想。Java语言的面向对象技术包括了面向对象和面向过程的基本概念,面向对象的特征,Java语言的类,对象,修饰符,抽象类等一系列的知识点
    2022-03-03
  • Java 异步编程实践_动力节点Java学院整理

    Java 异步编程实践_动力节点Java学院整理

    异步编程提供了一个非阻塞的,事件驱动的编程模型。下面通过本文给大家介绍Java 异步编程实践,感兴趣的的朋友一起看看吧
    2017-05-05
  • Seata AT模式如何实现行锁详解

    Seata AT模式如何实现行锁详解

    这篇文章主要为大家介绍了Seata AT模式如何实现行锁详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java的String类中的startsWith方法和endsWith方法示例详解

    Java的String类中的startsWith方法和endsWith方法示例详解

    大家应该都知道startsWith()方法用于检测字符串是否以指定的前缀开始,endsWith()方法用于测试字符串是否以指定的后缀结束,本文就Java的String类中的startsWith方法和endsWith方法给大家详细讲解,感兴趣的朋友一起看看吧
    2023-11-11
  • Java之api网关断言及过滤器案例讲解

    Java之api网关断言及过滤器案例讲解

    这篇文章主要介绍了Java之api网关断言及过滤器案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 详解Spring如何避免被JVM 垃圾回收

    详解Spring如何避免被JVM 垃圾回收

    如果Spring 被回收掉,Spring管理的bean全部会被回收,那我们的Java应用不就被一锅端了吗?所以本文小编将和大家一起聊聊Spring如何避免被JVM垃圾回收,需要的朋友可以参考下
    2023-11-11
  • Java桶排序之基数排序详解

    Java桶排序之基数排序详解

    这篇文章主要为大家介绍了Java桶排序之基数排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Java基于socket编程相关知识解析

    Java基于socket编程相关知识解析

    这篇文章主要为大家详细解析了Java基于socket编程的相关知识,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09

最新评论