java中序列化与反序列化_Java中的序列化

java中序列化与反序列化

Java提供了一种称为序列化的机制,以按字节的有序或字节序列的形式持久化Java对象,其中包括对象的数据以及有关对象的类型和存储在对象中的数据类型的信息。 因此,如果我们已序列化了任何对象,则可以使用对象的类型和其他信息对其进行读取和反序列化,以便检索原始对象。

类ObjectInputStream和ObjectOutputStream是高级流,其中包含用于序列化和反序列化对象的方法。 ObjectOutputStream有许多用于序列化对象的方法,但是常用的方法是:

private void writeObject(ObjectOutputStream os) throws IOException{ }

同样,ObjectInputStream具有

private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException{}

需要序列化吗?

通常在需要通过网络发送数据或存储在文件中时使用序列化。 数据是对象,而不是文本。 现在的问题是您的网络基础结构和硬盘是可以理解位和字节但不能理解Java对象的硬件组件。 序列化是将Java对象的值/状态转换为字节,以便通过网络发送或保存它。反序列化是将字节码转换为相应的Java对象。

serialVersionUID的概念:

SerialVersionUID用于确保在反序列化期间加载相同的对象(在序列化期间使用的对象)。serialVersionUID用于对象的版本控制。您可以在java序列化中的serialVersionUID上内容

对于序列化:

步骤如下:

让我们举个例子:在src-> org.arpit.javapostsforlearning中创建Employee.java:

1,Employee.java

package org.arpit.javapostsforlearning;
import java.io.Serializable;
public class Employee implements Serializable{int employeeId;String employeeName;String department;public int getEmployeeId() {return employeeId;}public void setEmployeeId(int employeeId) {this.employeeId = employeeId;}public String getEmployeeName() {return employeeName;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}public String getDepartment() {return department;}public void setDepartment(String department) {this.department = department;}
}

从上面可以看到,如果要序列化任何类,则它必须实现Serializable接口(即标记接口)。

Java中的标记接口是没有字段或方法的接口,或者简单的单词空接口在Java中称为标记接口。 在src-> org.arpit.javapostsforlearning中创建SerializeMain.java

2. SerializeMain.java

package org.arpit.javapostsforlearning;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class SerializeMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {Employee emp = new Employee();emp.setEmployeeId(101);emp.setEmployeeName('Arpit');emp.setDepartment('CS');try{FileOutputStream fileOut = new FileOutputStream('employee.ser');ObjectOutputStream outStream = new ObjectOutputStream(fileOut);outStream.writeObject(emp);outStream.close();fileOut.close();}catch(IOException i){i.printStackTrace();}}
}

对于反序列化:

步骤如下:

在src-> org.arpit.javapostsforlearning中创建DeserializeMain.java

3.DeserializeMain.java

package org.arpit.javapostsforlearning;
import java.io.IOException;
import java.io.ObjectInputStream;public class DeserializeMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {Employee emp = null;try{FileInputStream fileIn =new FileInputStream('employee.ser');ObjectInputStream in = new ObjectInputStream(fileIn);emp = (Employee) in.readObject();in.close();fileIn.close();}catch(IOException i){i.printStackTrace();return;}catch(ClassNotFoundException c){System.out.println('Employee class not found');c.printStackTrace();return;}System.out.println('Deserialized Employee...');System.out.println('Emp id: ' + emp.getEmployeeId());System.out.println('Name: ' + emp.getEmployeeName());System.out.println('Department: ' + emp.getDepartment());}
}

4,运行它

首先运行SerializeMain.java,然后运行DeserializeMain.java,您将获得以下输出:

Deserialized Employee...
Emp id: 101
Name: Arpit
Department: CS

因此,我们先序列化了一个雇员对象,然后对其进行反序列化。这看起来很简单,但是当引用对象,继承关系出现时,它可能会非常复杂。因此,我们将逐一介绍不同的情况以及如何在不同的情况下应用序列化。

情况1-如果一个对象引用了其他对象怎么办

我们已经看到了非常简单的序列化案例,现在如果它也引用了其他对象又该怎么办呢?它将如何序列化呢? 是的,您不必显式地序列化引用对象。当序列化任何对象并且如果它包含任何其他对象引用时,Java序列化将序列化该对象的整个对象图。

例如:让我们说,Employee现在引用了地址对象,而Address可以引用了其他某个对象(例如Home),那么当您序列化Employee对象时,所有其他引用对象(例如address和home)都将自动序列化。 让我们创建Address类并添加Address对象作为对上述雇员类的引用。

Employee.java:

package org.arpit.javapostsforlearning;
import java.io.Serializable;public class Employee implements Serializable{int employeeId;String employeeName;String department;Address address;public int getEmployeeId() {return employeeId;}public void setEmployeeId(int employeeId) {this.employeeId = employeeId;}public String getEmployeeName() {return employeeName;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}public String getDepartment() {return department;}public void setDepartment(String department) {this.department = department;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}
}

在org.arpit.javapostsforlearning中创建Address.java:

地址.java:

package org.arpit.javapostsforlearning;
public class Address {int homeNo;String street;String city;public Address(int homeNo, String street, String city) {super();this.homeNo = homeNo;this.street = street;this.city = city;}public int getHomeNo() {return homeNo;}public void setHomeNo(int homeNo) {this.homeNo = homeNo;}public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}
}

在org.arpit.javaposts学习中创建SerializeDeserializeMain.java:

SerializeDeserializeMain.java:
package org.arpit.javapostsforlearning;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class SerializeDeserializeMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {Employee emp = new Employee();emp.setEmployeeId(101);emp.setEmployeeName('Arpit');emp.setDepartment('CS');Address address=new Address(88,'MG road','Pune');emp.setAddress(address);//Serializetry{FileOutputStream fileOut = new FileOutputStream('employee.ser');ObjectOutputStream outStream = new ObjectOutputStream(fileOut);outStream.writeObject(emp);outStream.close();fileOut.close();}catch(IOException i){i.printStackTrace();}//Deserializeemp = null;try{FileInputStream fileIn =new FileInputStream('employee.ser');ObjectInputStream in = new ObjectInputStream(fileIn);emp = (Employee) in.readObject();in.close();fileIn.close();}catch(IOException i){i.printStackTrace();return;}catch(ClassNotFoundException c){System.out.println('Employee class not found');c.printStackTrace();return;}System.out.println('Deserialized Employee...');System.out.println('Emp id: ' + emp.getEmployeeId());System.out.println('Name: ' + emp.getEmployeeName());System.out.println('Department: ' + emp.getDepartment());address=emp.getAddress();System.out.println('City :'+address.getCity());}
}

运行 :

运行SerializeDeserializeMain.java时,将获得以下输出:

java.io.NotSerializableException: org.arpit.javapostsforlearning.Addressat java.io.ObjectOutputStream.writeObject0(Unknown Source)at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)at java.io.ObjectOutputStream.writeSerialData(Unknown Source)at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)at java.io.ObjectOutputStream.writeObject0(Unknown Source)at java.io.ObjectOutputStream.writeObject(Unknown Source)

我们错了,出了什么问题。我忘了提,Address类也必须是可序列化的。因此,您必须通过实现serialzable接口使Address序列化。

地址.java:

import java.io.Serializable;public class Address implements Serializable{int homeNo;String street;String city;public Address(int homeNo, String street, String city) {super();this.homeNo = homeNo;this.street = street;this.city = city;} public int getHomeNo() {return homeNo;}public void setHomeNo(int homeNo) {this.homeNo = homeNo;}public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}
}

再次运行:

再次运行SerializeDeserializeMain.java时,将获得以下输出:

Deserialized Employee...  
Emp id: 101  
Name: Arpit  
Department: CS  
City: Pune

情况2:如果您无权访问引用对象的源代码(例如,您无权访问上述Address类)该怎么办?

如果您没有访问地址类的权限,那么如何在地址类中实现可序列化的接口呢? 是的,您可以创建另一个扩展地址并使其可序列化的类,但是在许多情况下它可能会失败:

  • 如果将类声明为final怎么办
  • 如果类引用其他不可序列化的对象该怎么办。

那么,您将如何序列化Employee对象? 所以解决方案是您可以使其瞬态。如果您不想序列化任何字段,请使其瞬态。

transient Address address

因此,在运行程序时在Employee类中使地址瞬态之后,您将获得nullPointerException,因为在反序列化期间地址引用将为null

情况3:如果您仍要保存引用对象的状态(例如,地址对象上方),该怎么办:

如果您使地址处于瞬态状态,那么在反序列化期间它将返回null。但是如果您仍然希望与序列化地址对象时的状态相同,那么Java序列化提供了一种机制,如果您具有带有特定签名的私有方法,则它们将获得在序列化和反序列化过程中被调用,因此我们将覆盖employee类的writeObject和readObject方法,它们将在Employee对象的序列化和反序列化过程中被调用。

Employee.java:

package org.arpit.javapostsforlearning;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class Employee implements Serializable{int employeeId;String employeeName;String department;transient Address address;public int getEmployeeId() {return employeeId;}public void setEmployeeId(int employeeId) {this.employeeId = employeeId;}public String getEmployeeName() {return employeeName;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}public String getDepartment() {return department;}public void setDepartment(String department) {this.department = department;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}private void writeObject(ObjectOutputStream os) throws IOException, ClassNotFoundException{ try {os.defaultWriteObject();os.writeInt(address.getHomeNo());os.writeObject(address.getStreet());os.writeObject(address.getCity());} catch (Exception e) { e.printStackTrace(); }}private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException{try {is.defaultReadObject();int homeNo=is.readInt();String street=(String) is.readObject();String city=(String) is.readObject();address=new Address(homeNo,street,city);} catch (Exception e) { e.printStackTrace(); }}
}

应该记住的一点是,ObjectInputStream应该以我们将数据写入ObjectOutputStream的相同顺序读取数据。 在org.arpit.javapostsforlearning中创建Address.java:

地址.java:

package org.arpit.javapostsforlearning;
import java.io.Serializable;public class Address {int homeNo;String street;String city;public Address(int homeNo, String street, String city) {super();this.homeNo = homeNo;this.street = street;this.city = city;}public int getHomeNo() {return homeNo;}public void setHomeNo(int homeNo) {this.homeNo = homeNo;}public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}
}

在org.arpit.javaposts学习中创建SerializeDeserializeMain.java:

SerializeDeserializeMain.java:

package org.arpit.javapostsforlearning;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class SerializeDeserializeMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {Employee emp = new Employee();emp.setEmployeeId(101);emp.setEmployeeName('Arpit');emp.setDepartment('CS');Address address=new Address(88,'MG road','Pune');emp.setAddress(address);//Serializetry{FileOutputStream fileOut = new FileOutputStream('employee.ser');ObjectOutputStream outStream = new ObjectOutputStream(fileOut);outStream.writeObject(emp);outStream.close();fileOut.close();}catch(IOException i){i.printStackTrace();}//Deserializeemp = null;try{FileInputStream fileIn =new FileInputStream('employee.ser');ObjectInputStream in = new ObjectInputStream(fileIn);emp = (Employee) in.readObject();in.close();fileIn.close();}catch(IOException i){i.printStackTrace();return;}catch(ClassNotFoundException c){System.out.println('Employee class not found');c.printStackTrace();return;}System.out.println('Deserialized Employee...');System.out.println('Emp id: ' + emp.getEmployeeId());System.out.println('Name: ' + emp.getEmployeeName());System.out.println('Department: ' + emp.getDepartment());address=emp.getAddress();System.out.println('City :'+address.getCity());}
}

运行 :

运行SerializeDeserializeMain.java时,将获得以下输出:

Deserialized Employee...
Emp id: 101
Name: Arpit
Department: CS
City :Pune

所以现在我们得到的地址对象的状态与序列化之前的状态相同。

序列化中的继承:

现在我们将了解继承如何影响序列化,因此在某些情况下,超类是否可序列化是可能的,如果不是,那么您将如何处理它以及它如何工作。 我们将创建Person.java,它将是Employee的超类:

情况4:如果超类是可序列化的怎么办?

如果超类是可序列化的,则其所有子类都可以自动序列化。

情况5:如果超类不可序列化怎么办?

如果超类不能序列化,那么我们必须以完全不同的方式处理它。

  • 如果超类不可序列化,则它必须没有参数构造函数。

人.java

package org.arpit.javapostsforlearning;
public class Person {String name='default';String nationality;public Person(){System.out.println('Person:Constructor');}public Person(String name, String nationality) {super();this.name = name;this.nationality = nationality;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNationality() {return nationality;}public void setNationality(String nationality) {this.nationality = nationality;}}

在org.arpit.javapostsforlearning中创建Employee.java:

Employee.java:

package org.arpit.javapostsforlearning;
import java.io.Serializable;public class Employee extends Person implements Serializable{int employeeId;String department;public Employee(int employeeId,String name,String department,String nationality){super(name,nationality);this.employeeId=employeeId;this.department=department;System.out.println('Employee:Constructor');}public int getEmployeeId() {return employeeId;}public void setEmployeeId(int employeeId) {this.employeeId = employeeId;}public String getDepartment() {return department;}public void setDepartment(String department) {this.department = department;}
}

在org.arpit.javaposts学习中创建SerializeDeserializeMain.java:

SerializeDeserializeMain.java:

package org.arpit.javapostsforlearning;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class SerializeDeserializeMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {//SerializeEmployee emp = new Employee(101,'Arpit','CS','Indian');System.out.println('Before serializing');System.out.println('Emp id: ' + emp.getEmployeeId());System.out.println('Name: ' + emp.getName());System.out.println('Department: ' + emp.getDepartment());System.out.println('Nationality: ' + emp.getNationality());System.out.println('************');System.out.println('Serializing');try{FileOutputStream fileOut = new FileOutputStream('employee.ser');ObjectOutputStream outStream = new ObjectOutputStream(fileOut);outStream.writeObject(emp);outStream.close();fileOut.close();}catch(IOException i){i.printStackTrace();}//DeserializeSystem.out.println('************');System.out.println('Deserializing');emp = null;try{FileInputStream fileIn =new FileInputStream('employee.ser');ObjectInputStream in = new ObjectInputStream(fileIn);emp = (Employee) in.readObject();in.close();fileIn.close();}catch(IOException i){i.printStackTrace();return;}catch(ClassNotFoundException c){System.out.println('Employee class not found');c.printStackTrace();return;}System.out.println('After serializing');System.out.println('Emp id: ' + emp.getEmployeeId());System.out.println('Name: ' + emp.getName());System.out.println('Department: ' + emp.getDepartment());System.out.println('Nationality: ' + emp.getNationality());}
}

运行 :

运行SerializeDeserializeMain.java时,将获得以下输出:

如果超类不可序列化,则在反序列化过程中,将通过调用Non-Serializable超类的构造函数来初始化从超类继承的实例变量的所有值。 因此,这里name是从person继承的,因此在反序列化期间,name会初始化为默认值。

情况6-如果超类可序列化但您不希望子类可序列化怎么办

如果您不希望子类可序列化,则需要实现writeObject()和readObject()方法,并且需要从该方法中抛出NotSerializableException。

情况7-您可以序列化静态变量吗?

不,您不能这样做。您知道静态变量是在类级别而不是对象级别,并且您序列化了一个对象,因此您无法序列化静态变量。

摘要:

  • 序列化是将Java对象的值/状态转换为字节,以便通过网络发送或保存它。反序列化是将字节码转换为相应的Java对象。
  • 关于序列化的好处是,整个过程是与JVM无关的,这意味着可以在一个平台上序列化对象,并在完全不同的平台上反序列化对象。\
  • 如果要序列化任何类,则它必须实现Serializable接口,该接口是标记接口。
  • Java中的标记接口是没有字段或方法的接口,或者简单的单词空接口在Java中称为标记接口
  • serialVersionUID用于确保在反序列化期间加载相同的对象(在序列化过程中使用的对象)。serialVersionUID用于对象的版本控制。
  • 当序列化任何对象并且如果它包含任何其他对象引用时,Java序列化将序列化该对象的整个对象图。
  • 如果您不想序列化任何字段,请使其为临时字段。
  • 如果超类是可序列化的,则其子类将自动可序列化。
  • 如果超类不可序列化,则在反序列化过程中,将通过调用Non-Serializable超类的构造函数来初始化从超类继承的实例变量的所有值。
  • 如果您不希望子类可序列化,则需要实现writeObject()和readObject()方法,并且需要从该方法中抛出NotSerializableException。
  • 您不能序列化静态变量。

参考:来自JCG合作伙伴 Arpit Mandliya的Java 序列化, 适用于初学者博客的Java框架和设计模式 。

翻译自: https://www.javacodegeeks.com/2013/03/serialization-in-java.html

java中序列化与反序列化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java命令行界面(第3部分):jbock

在本系列中有关使用Java进行命令行分析的前两篇文章中,我介绍了Apache Commons CLI和args4j库。 在本系列的第三篇文章中,我将介绍jbock ,它是自我描述的“非常简单的CLI解析器”。 我在Java中进行命令行解析的文章使用了一些示例&#xff0…

java 关闭串口_java – 打开和关闭串行端口

我正在尝试连接到Serial Port …但是一旦我第一次打开串行端口.我不能再打开它,我试着申请.这是我的代码:public static void main(String[] args) {portList CommPortIdentifier.getPortIdentifiers();while (portList.hasMoreElements()) {portId (CommPortIden…

java collection详解_java 7 collection 详解(一)

一、综述java集合框架定义了几个接口,这些接口决定了collection类的基本特性。不同的是,具体类仅仅是提供了标准接口的不同实现,如图,java集合框架接口图从图可知,java集合类的主要是由两个接口派生而出——Collection…

java导出pdf 含图片_java 生成PDF含图片和中文件实现代码

1,所需包 iText.jar iTextAsian.ar(支持中包)2,列子package com.pdf;import java.awt.Color;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.net.MalformedURLException;import javax.naming.spi.DirectoryManager;import com.l…

jsf tree组件_JSF:在传统组件和时尚性能杀手之间进行选择

jsf tree组件这篇博客文章起源于一个大型Web应用程序中的性能问题。 每个人都优化Java代码,但似乎没有人尝试优化JavaScript代码。 奇怪,因为在客户端有很多改进的空间。 我会说,甚至比服务器端还要多。 我们将分析可编辑的JSF标准组件&#…

java耗时操作阻塞_spring boot高并发下耗时操作的实现方法

高并发下的耗时操作高并发下,就是请求在一个时间点比较多时,很多写的请求打过来时,你的服务器承受很大的压力,当你的一个请求处理时间长时,这些请求将会把你的服务器线程耗尽,即你的主线程池里的线程将不会…

如何在Java中转义JSON字符串-Eclipse IDE技巧

在Java应用程序中工作或进行JSON解析时,通常很常见的做法是从某些资源(例如RESTful Web服务)中复制粘贴JSON字符串,然后使用Jackson库解析JSON。 这是测试和学习Java中解析JSON字符串的最快方法,但是这种方法的主要问题…

java hashmap实例_java HashMap详解及实例代码

java hashmap/** map集合的特点* 将键映射值的对象,一个映射不能包含重复的值;每个键最多只能映射到一个值** map集合和collection集合的区别?* map集合存储元素是成对出现的,map集合的键是唯一的,就是可重复的。可以把…

spring javafx_带有Spring的JavaFX 2

spring javafx我将从一个大胆的声明开始:我一直很喜欢Java Swing或applet。 在那里,我说了。 如果我进行一些自我分析,那么这种钦佩可能是在我接触Java时开始的。 Swing(实际上)是我使用Java所做的第一件事&#xff0c…

jframe和mysql登陆_刚写的一个从数据库读取账户和密码进行登陆的小程序~高手请无~...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.*; import javax.swing.*;public class LoginSystem extends JFrame{publi…

使用WebCrypto API的电子签名

有时我们需要让用户进行电子签名。 通常,人们会理解为将您的手写签名以某种方式放在屏幕上。 根据管辖范围,可能很好,或者仅存储图像可能还不够。 例如,在欧洲,有910/2014号法规 ,该法规定义了什么是电子签…

mycat mysql 物理部署_一、MyCat的搭建

一、什么是mycat简单直接点就是,MyCat其实就是一个数据库的中间件!一般我们都是app直接到数据库!有了MyCat以后,就是app到MyCat然后再访问数据库。mycat是个中间件,它负责连接管理mysql,应用程序连接mycat,把mycat当作…

java 记事本换行_[求助]记事本自动换行

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我编的一个记事本 自动换行该如何实现import java.io.*;import java.awt.*;import java.awt.event.*;import java.awt.print.*;public class Jishiben extends Frame implements ActionListener{FileDialog fileDlg;String str, f…

JAVA中的适配器应用_Java适配器模式应用之电源适配器功能详解

本文实例讲述了Java适配器模式应用之电源适配器功能。分享给大家供大家参考,具体如下:一、模式定义存在两种适配器模式1 对象适配器模式,在这种适配器模式中,适配器容纳一个它包裹的类对象的物理实体。2 类适配器模式,…

java.util接口_函数接口– Java 8中java.util.function包中的函数接口

java.util接口我以前写过有关功能接口及其用法的文章。 如果您正在探索要成为Java 8一部分的API,尤其是那些支持lambda表达式的API,您会发现很少的接口,例如Function,Supplier,Consumer,Predicate和其他接口…

java new string作用_java中直接new String对象?

首先明确一点,在Java中比较的是两个对象的地址,equals()比较的是两个对象的值,如果使用equals()来替换,则两个输出结果都为true。言归正传,为什么第一个返回为false?先看一下intern()这个方法的描述&#x…

Apache Camel中的短重试与长重试

《骆驼设计模式》一书介绍了20种模式以及用于设计基于Apache Camel的集成解决方案的众多技巧和最佳实践。 每个模式都基于真实的用例,并提供了Camel特定的实现细节和最佳实践。 为了让您有这本书的感觉,以下是该书的重试模式摘录,其中介绍了如…

java注解的继承_Java注解合并,注解继承

spring中有时候一个类上面标记很多注解。实际上Java注解可以进行继承(也就是把多个注解合并成1个)比如说SpringMVC的注解RestControllerRequestMapping("/person")可以合并为一个PathRestController("/user")实现是:import java.lang.annotatio…

java实现驾校考试系统_jsp驾校考试系统

本驾校考试系统采用了Browser/Server体系结构,JSP(Java Server Page)作为前台开发工具,MySQL作为后台数据库进行开发。最终系统实现的系统将分为管理员和学员两个角色,其中系统管理员部分的主要功能包括修改登录密码、学员信息管理、科目1题目…

Java Maven和Gradle构建的主题缓存

Concourse CI 3.3.x引入了在任务运行之间缓存路径的功能。 此功能有助于加快将内容缓存在特定文件夹中的任务-在这里,我将演示如何使用此功能来加快基于Maven和Gradle的Java构建。 我在这篇文章中使用的代码和管道可以在我的github仓库中找到 – https://github.co…