偶然间发现有个系统的对外交互的实体对象之前没有显示的声明该类的序列化版本id 。为了后续的代码升级考虑,打算对所有的dto 做一次升级 。 但是,考虑到之前这些dto对象已经被外围的多个系统使用 ,贸然的添加新的VersionId 可能会导致反序列化的失败 。稳妥起见, 打算先计算出系统dto目前在序列化时,系统默认生成的versionId , 然后把获得的id 添加到老的dto中。老的dto代码如下
public class ContractDto implements Serializable{
private String contractNo ;
private String companyName ;
public static int amount = 1000 ;
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
ContractDto.amount = amount;
}
public String getContractNo() {
return contractNo;
}
public void setContractNo(String contractNo) {
this.contractNo = contractNo;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
}
写了一段获取dto的serialVersionUID 的方法如下(这里我进一步验证了jdk1.5 ,1.6俩个版本间 ,系统默认给出的id 的差异, 结果发现是相同的,具体做法我不详细说了, 就是在eclipse中对jdk版本做切换):
public class SerialVersionFactory {
public static void main(String args[]){
SerialVersionFactory.getSerialVersionUID(ContractDto.class.getName());
}
private static long getSerialVersionUID(String className){
Class cl = null;
try {
cl = Class.forName(className);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("使用的java版本:"+System.getProperty("java.version"));
// Then an ObjectStreamClass for the given class
ObjectStreamClass ocl = ObjectStreamClass.lookup(cl);
long versionUID = ocl.getSerialVersionUID() ;
// And use the ObjectStreamClass to get the Class'
// unique SerialVersionUID
System.out.println("For class " + cl);
System.out.println("static final long serialVersionUID = "
+ versionUID + "L;"); // must be long
// And just for reference...
System.out.println("(Must range from " + Long.MIN_VALUE + " to "
+ Long.MAX_VALUE + ".)");
return versionUID ;
}
}
运行结果如下:
使用的java版本:1.6.0_20
For class class monkey.serial.study.yes.ContractDto
static final long serialVersionUID = -5065686433333130227L;
(Must range from -9223372036854775808 to 9223372036854775807.)
使用的java版本:1.5.0_22
For class class monkey.serial.study.yes.ContractDto
static final long serialVersionUID = -5065686433333130227L;
(Must range from -9223372036854775808 to 9223372036854775807.)
可以看到 ,jdk不同版本间 ,生成出来的versionid是一致的 。另外, 我在contractDto中新增加了一个属性,如下
public class ContractDto implements Serializable{
private String contractNo ;
private String companyName ;
public static int amount = 1000 ;
public String test = "abc" ;
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
ContractDto.amount = amount;
}
public String getContractNo() {
return contractNo;
}
public void setContractNo(String contractNo) {
this.contractNo = contractNo;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
}
在此运行测试代码, 结果如下:
使用的java版本:1.6.0_20
For class class monkey.serial.study.yes.ContractDto
static final long serialVersionUID = -8371732973844926670L;
(Must range from -9223372036854775808 to 9223372036854775807.)
这个时候生成的versiionid 随着实体的变化也发生了变化 。
分享到:
相关推荐
在IT行业中,DTO(Data Transfer Object)是一种设计模式,用于在系统之间传递数据,它将业务逻辑层与表现层的数据解耦。标题“分页dto把html写在dto里”和描述“把分页按钮写在dto里,其他dto继承他”表明了一个...
- 为了解决手动创建实体类和DTO的繁琐工作,存在一些工具能够自动生成这些类。这类工具可以根据数据库的元数据,如表结构和字段信息,自动生成对应的Java源代码。 - 使用这些工具,开发者只需要配置数据库连接信息...
在软件开发过程中,数据传输对象(Data Transfer Object, DTO)是一种常见的设计模式,用于在系统之间传递大量数据。DTO不包含任何业务逻辑,主要是数据容器。在这个场景中,"快速生成DTO"指的是利用Excel模板来自动...
DTO,全称Data Transfer Object,是软件设计模式中的一种,主要用在分布式系统或Web服务之间,用于数据的传输。DTO对象通常不包含任何业务逻辑,仅仅是数据的载体,使得不同层之间的数据交换变得简单。在这个"登陆的...
DTO模式的核心思想是将数据封装在一个独立的对象中,这个对象不包含任何业务逻辑,仅仅用于数据的存储和获取。这样做的好处在于,当数据需要跨层传输时,可以避免直接传递复杂的业务对象,防止了不同层之间的相互...
这个插件专为IntelliJ IDEA用户设计,能够根据数据库结构和已有的Java代码自动生成强类型的DTO类,从而提高开发效率和代码质量。 首先,让我们深入了解DTO的概念。DTO是一种设计模式,主要用于隔离数据的表示层和...
在IT行业中,尤其是在Java开发领域,数据传输对象(DTO,Data Transfer Object)是一种常见的设计模式,用于在系统组件之间传递数据。"导入Excel快速生成DTO"这个标题暗示了一个工具或库,它能帮助开发者从Excel文件...
3. **提高效率**:相比于多次调用服务端接口获取数据,使用DTO可以在一次调用中获取所有必要的数据,从而减少了网络通信的次数和开销。 4. **确保一致性**:使用DTO可以确保数据的一致性和完整性,在多层架构中尤其...
简单的EntityFramework4.3+三层+DTO,如果需要简化版的,我的资源里有一个不含DTO的版本。 这个Demo的主要功能是: 1、实体类的创建、复杂类型的嵌套 2、实体类的配置(主键、外键、一对一、1对多,多对多) 3、...
DTO(Data Transfer Object)代码自动生成器是一种工具,旨在帮助开发者快速、高效地根据数据库模型创建对应的Java实体类。在软件开发过程中,DTO通常用于在系统不同层之间传递数据,避免了直接暴露业务对象,降低了...
例如,通过这个库,开发者可以快速地获取并解析游戏中的各种数据,进而构建数据分析应用、统计报告或者可视化工具。 在实际使用过程中,开发者需要确保其环境已经安装了所有必要的依赖,并遵循库提供的安装和使用...
"java_dao_dto生成器" 是一个工具,它自动化了创建DAO层和DTO(Data Transfer Object)的过程。DTO是用于在系统不同组件之间传递数据的对象,通常用来避免直接暴露底层数据结构。在Java开发中,手动编写这些类可能会...
在Java开发中,数据传输对象(DTO)和持久化对象(POJO)是常见的概念,它们用于在不同层之间传递数据。手动创建这些类可能会耗费大量时间,特别是在处理大量数据库表时。因此,"eclipse插件,根据数据库表自动生成...
例如,从数据库获取用户数据并转换为DTO: ```csharp public class UserService { private readonly MyAppDbContext _dbContext; private readonly IMapper _mapper; public UserService(MyAppDbContext ...
modify the property file of the database path, driver, user name, password, enter CMD to the D drive is running java-jar kingdao.jar disk in D test folder under the root directory of DAO and DTO ...
DTO数据传输对象简介PPT
在这个“feignclient发送get请求使用dto接收参数demo”中,我们将探讨如何利用FeignClient来发送GET请求,并通过DTO(Data Transfer Object)来接收和处理参数。 1. **FeignClient介绍** Feign是一个Java到Java的...
在软件开发中,数据传输对象(Dto,Data Transfer Object)和实体类(Entity Class)是两种常见的对象模型,它们在不同的场景中各自扮演着重要的角色。Dto主要用于在系统组件之间传递数据,而实体类通常代表数据库中...
Dto(Data Transfer Object)和JavaBean是Java编程中常见的两种对象模式,它们在软件开发中扮演着重要角色,尤其是在数据交换和模型表示方面。这里我们将深入探讨这两种对象以及如何通过工具自动化生成它们,并且...