首页 > 编程语言 >java 序列话注解 @Transient

java 序列话注解 @Transient

时间:2023-12-06 19:57:58浏览次数:49  
标签:java private Person Transient 注解 序列化 out

java 序列话注解 @Transient

Java 序列化注解及其使用

简介

在 Java 程序中,对象的序列化是指将对象转换为字节流的过程,以便在网络上传输或保存到文件中。而反序列化则是将字节流重新转换为对象。

Java 提供了 java.io.Serializable 接口,用于标识可序列化的类。然而,有时我们希望在序列化的过程中排除某些字段,或者对某些字段进行自定义处理。这时,我们可以使用序列化注解来实现。

常用的序列化注解

@Transient

@Transient 是javax.persistence 包中的一个注解,它用于标记不希望序列化的字段。当对象被序列化时,被标记为 @Transient 的字段将被忽略。

public class Person implements Serializable {
    private String name;
    @Transient
    private int age;
    // getter and setter methods
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

上面的代码中,age 字段被标记为 @Transient,在序列化过程中将被忽略。

@Serialize

@Serialize 是 Java 序列化中自定义的一个注解,它用来标记字段在序列化过程中需要进行特殊处理。

public class Person implements Serializable {
    private String name;
    @Serialize
    private Date birthDate;
    // getter and setter methods
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

上述代码中,birthDate 字段被标记为 @Serialize,在序列化过程中将被特殊处理。

@Serial

在 Java 序列化中,如果需要自定义序列化和反序列化的过程,可以使用 @Serial 注解。

public class Person implements Serializable {
    private String name;
    @Serial
    private int age;
    // getter and setter methods
    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(age);
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        age = in.readInt();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

上述代码中,writeObject 方法用来自定义序列化过程,readObject 方法用来自定义反序列化过程。通过 @Serial 注解,我们可以自行控制序列化和反序列化的细节。

序列化与反序列化示例

下面是一个示例代码,演示了如何使用序列化注解来实现对象的序列化和反序列化。

import java.io.*;
public class SerializationExample {
    public static void main(String[] args) {
        // 创建一个 Person 对象
        Person person = new Person();
        person.setName("Alice");
        person.setAge(25);
        // 将对象序列化到文件中
        serialize(person, "person.ser");
        // 从文件中反序列化对象
        Person deserializedPerson = deserialize("person.ser");
        // 打印反序列化后的对象
        System.out.println("Name: " + deserializedPerson.getName());
        System.out.println("Age: " + deserializedPerson.getAge());
    }
    private static void serialize(Object object, String fileName) {
        try (FileOutputStream fileOut = new FileOutputStream(fileName);
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
            out.writeObject(object);
            System.out.println("Serialized data is saved in " + fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static <T> T deserialize(String fileName) {
        T object = null;
        try (FileInputStream fileIn = new FileInputStream(fileName);
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
            object = (T) in.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return object;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.

上面的代码中,我们创建了一个 Person 对象,并将其序列化到文件 person.ser 中。然后,我们使用 deserialize 方法从文件中反序列化对象,并打印出反序列化后的结果。

总结

序列化注解提供了一种灵活的方式来控制对象的序列化和反序列化过程。通过使用 @Transient 注解,我们可以排除不需要序列化的字段;通过使用 @Serialize 注解,我们可以对需要特殊处理的字段进行标记;而通过使用 @Serial 注解,我们可以自定义序列化和反序列化的过程。

通过本文

    </div>
        </div>

原文链接:https://blog.51cto.com/u_16213300/7054837

标签:java,private,Person,Transient,注解,序列化,out
From: https://www.cnblogs.com/sunny3158/p/17880378.html

相关文章

  • @SpringBootTest 和 @RunWith 注解不能识别 单元测试第一步引入maven依赖
    @SpringBootTest和@RunWith注解不能识别单元测试第一步引入maven依赖一、背景    最近在预研 Rocketmq,在写小例子的时候,需要编写测试代码,突然间发现我的 @SpringBootTest 和 @RunWith 这两个注解不能识别,于是展开了我的问题排查过程。问题截图如下:二、问题排......
  • @RunWith注解找不到,怎么办? spring-boot-starter-test 2.5.5 版本只需要在类上加上@Spr
    @RunWith注解找不到,怎么办?spring-boot-starter-test2.5.5版本只需要在类上加上@SpringBootTest即可,不需要再加@RunWith()注解了。1、新版spring-boot-starter-test不再集成junit,而是junit-jupiter在这里,先说明我使用的版本SpringBoot2.5.5spring-boot-starter-test2.5......
  • java进行文件搜索的一个小案例
    分享一个小demo,可以查询某个文件目录下的某个文件并启动,来自黑马的IO教程importjava.io.File;importjava.io.IOException;publicclassApp3{publicstaticvoidmain(String[]args)throwsIOException{searchFile(newFile("D:/"),"pycharm64.exe");......
  • java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候
    java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。先......
  • Java第四课_循环和函数
    1.循环for/*for(初始化语句A;boolean类型表达式B;更改表达式C){循环体,就是需要被重复执行的代码;D}执行顺序:for-->A-->B-->|false:循环到此结束......
  • 使用百度完成gui的图像处理(需要下载百度的javasdk文档,主要工具带代码在sdk之中,以下代
    packageGui;importcom.baidu.aip.imageprocess.AipImageProcess;importorg.json.JSONObject;importjavax.imageio.ImageIO;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.i......
  • 2023最新java面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-java面试题合集问:什么是抽象类和接口?抽象类和接口是面向对象编程中的两个重要概念,它们在Java、C#等编程语言中得到了广泛的应用。以下是关于抽象类和接口的解释:抽象类(AbstractClass):抽象类是一个不能被实例化的类,通常用于作为其他类......
  • 2023最新中级java面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级java面试题合集问:请解释什么是Java虚拟机(JVM),以及它的主要功能是什么?Java虚拟机(JVM)是一个虚拟的计算机,它在实际的硬件和操作系统上运行,并且能够执行Java字节码。Java字节码是由Java编译器从Java源代码编译而来的。JVM是Java平台的核......
  • 2023最新高级java面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级java面试题合集问:能否描述一下Java的垃圾回收机制及其工作原理?当然可以。Java的垃圾回收机制:Java的垃圾回收(GarbageCollection,简称GC)机制是Java虚拟机(JVM)的一部分,它自动处理应用程序不再使用的对象的内存。该机制帮助开发者避免......
  • 四.JAVA循环
    四.JAVA循环,方法‘\t’:制表符//TODO:代办事项for循环for(初始化语句A;boolean类型表达式B;更改表达式){ 循环体;D}执行顺序:for-->A-->B  |false:循环结束  |true:-->D-->C-->B死循环:boolean类型值恒为真for循环中boolean类......