Java之实现Serializable接口的类,transient关键字

简介: Java之实现Serializable接口的类,transient关键字

   我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。


     序列化是编程的一种解决问题的方式。JAVA序列化就是将对象按照某种协议格式(某种约定方式)放入一个buffer中,其目的是便于网络传输或持久存储。反序列化,就是将序列化后的buffer按照序列化时还原成原来的对象,这样程序就能直接使用还原的对象了。


实例:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
 * 
 * @Description :Serializable关键字
 * @author Bush罗
 * @date 2018年5月12日
 *
 */
public class Main {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // TODO Auto-generated method stub
        createObj();
        readObj();
    }
    //(一)先写入对象
    public static void createObj() throws IOException {
        //1.创建目标路径
        File file = new File("D:/objTest.txt");
        //2.创建流通道
        FileOutputStream fos = new FileOutputStream(file);
        //3.创建对象输出流
        ObjectOutputStream objOP = new ObjectOutputStream(fos);
        //4.创建类对象,并初始化
        Student stu = new Student("bushluo", "password");
        //5.向目标路径文件写入对象
        objOP.writeObject(stu);
        //6.关闭资源
        objOP.close();
    }
    //再读取对象
    public static void readObj() throws IOException, ClassNotFoundException {
        File file = new File("D:/objTest.txt");
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream objIP = new ObjectInputStream(fis);
        //读取对象数据,需要将对象流强制转换为 要写入对象的类型
        Student stu = (Student)objIP.readObject();
        System.out.println("name:"+stu.name+"\npassword:"+stu.password);
        objIP.close();  
    }
}
//创建要写入磁盘的类,这个类需要实现接口 Serializable(可系列化的)
class Student implements Serializable{
  //在这里保证了serialVersionUID 的唯一性,防止属性变量的临时改变,从而造成写入id与读取id不同
  private static final long serialVersionUID = 1L; 
  String name ;
  String password;
  //transient String  password; //transient修饰属性,表示暂时的,则这个属性不会被写入磁盘
  public Student(String name, String password) {
    super();
    this.name = name;
    this.password = password;
  }
}

这样对象对可以通过流来传输,先把对象序列化然后写入txt文件中,然后反序列化读取出来。

private static final long serialVersionUID = 1L; 

 这句话的作用相当于是为这个类做上版本标记,如果在反序列化之前,该类的属性值有变动,那么反序列化时还是用序列化时的版本,属性值还是没有改动之前的,防止了数据被脏读。


     如果一个有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。


2018051215133755 (1).png

对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。

相关文章
|
2天前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、"+"操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
1天前
|
存储 Java 编译器
课时11:综合实战:简单Java类
本次分享的主题是综合实战:简单 Java 类。主要分为两个部分: 1.简单 Java 类的含义 2.简单 Java 类的开发
|
3天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
17 5
|
1天前
|
Oracle Java 关系型数据库
课时37:综合实战:数据表与简单Java类映射转换
今天我分享的是数据表与简单 Java 类映射转换,主要分为以下四部分。 1. 映射关系基础 2. 映射步骤方法 3. 项目对象配置 4. 数据获取与调试
|
Java 编译器 对象存储
Java中的transient,volatile和strictfp关键字
Java中的transient,volatile和strictfp关键字 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如: 1. class T { 2. transient int a; //不需要维持 3. int b; //需要维持 4. } 这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。
1134 0
|
Java 编译器 对象存储
Java中的transient,volatile和strictfp关键字
    如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如: Java代码 class T {       transient int a;  //不需要维持       int b;  //需要维持    }   class T { transient int a; //不需要维持 int b; //需要维持 }     这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。
880 0
|
Java 编译器 对象存储
Java中的transient,volatile和strictfp关键字
Java中的transient,volatile和strictfp关键字 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如: Java代码 class T {      transient int a;  //不需要维持      int b;  //需要维持   }       这里,如果T类的一个对象写入一个持久的存储区域,
1131 0
|
9天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
120 60
【Java并发】【线程池】带你从0-1入门线程池
|
5天前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
51 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
21天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
87 14

热门文章

最新文章