- 浏览: 513494 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (563)
- 工作经验 (12)
- 数据库 (13)
- Servlet (10)
- Struts2 (1)
- Spring (25)
- Eclipse (5)
- Hibernate (5)
- Eclips (8)
- HTTP (7)
- J2EE (21)
- EHcache (1)
- HTML (11)
- 工具插件使用 (20)
- JPA (2)
- 杂谈 (17)
- 数据结构与算法 (3)
- Cloud Foundry (1)
- 安全 (10)
- J2SE (57)
- SQL (9)
- DB2 (6)
- 操作系统 (2)
- 设计模式 (1)
- 版本代码管理工具 (13)
- 面试 (10)
- 代码规范 (3)
- Tomcat (12)
- Ajax (5)
- 异常总结 (11)
- REST (2)
- 云 (2)
- RMI (3)
- SOA (1)
- Oracle (12)
- Javascript (20)
- jquery (7)
- JSP自定义标签 (2)
- 电脑知识 (5)
- 浏览器 (3)
- 正则表达式 (3)
- 建站解决问题 (38)
- 数据库设计 (3)
- git (16)
- log4j (1)
- 每天100行代码 (1)
- socket (0)
- java设计模式 耿祥义著 (0)
- Maven (14)
- ibatis (7)
- bug整理 (2)
- 邮件服务器 (8)
- Linux (32)
- TCP/IP协议 (5)
- java多线程并发 (7)
- IO (1)
- 网页小工具 (2)
- Flash (2)
- 爬虫 (1)
- CSS (6)
- JSON (1)
- 触发器 (1)
- java并发 (12)
- ajaxfileupload (1)
- js验证 (1)
- discuz (2)
- Mysql (14)
- jvm (2)
- MyBatis (10)
- POI (1)
- 金融 (1)
- VMWare (0)
- Redis (4)
- 性能测试 (2)
- PostgreSQL (1)
- 分布式 (2)
- Easy UI (1)
- C (1)
- 加密 (6)
- Node.js (1)
- 事务 (2)
- zookeeper (3)
- Spring MVC (2)
- 动态代理 (3)
- 日志 (2)
- 微信公众号 (2)
- IDEA (1)
- 保存他人遇到的问题 (1)
- webservice (11)
- memcached (3)
- nginx (6)
- 抓包 (1)
- java规范 (1)
- dubbo (3)
- xwiki (1)
- quartz (2)
- 数字证书 (1)
- spi (1)
- 学习编程 (6)
- dom4j (1)
- 计算机系统知识 (2)
- JAVA系统知识 (1)
- rpcf (1)
- 单元测试 (2)
- php (1)
- 内存泄漏cpu100%outofmemery (5)
- zero_copy (2)
- mac (3)
- hive (3)
- 分享资料整理 (0)
- 计算机网络 (1)
- 编写操作系统 (1)
- springboot (1)
最新评论
-
masuweng:
亦论一次OutOfMemoryError的定位与解错 -
变脸小伙:
引用[color=red][/color]百度推广中运用的技术 ...
Spring 3 mvc中返回pdf,json,xml等不同的view -
Vanillva:
不同之处是什么??
Mybatis中的like查询 -
thrillerzw:
转了。做个有理想的程序员
有理想的程序员必须知道的15件事 -
liujunhui1988:
觉得很有概括力
15 个必须知道的 Java 面试问题(2年工作经验)
源:http://mysun.iteye.com/blog/1581119
评:
大概意思就是说,在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中
enum内部变量 不能被序列化进去
在Java中,对Enum类型的序列化与其他对象类型的序列化有所不同,今天就来看看到底有什么不同。下面先来看下在Java中,我们定义的Enum在被编译之后是长成什么样子的。
Java代码:
Java代码 收藏代码
public enum FruitEnum {
APPLE, ORAGE
}
上面的代码定义了一个FruitEnum类型,是最简单形式的,下面我们来看看编译之后的字节码。
字节码:
Java代码 收藏代码
public final class com.taobao.tianxiao.FruitEnum extends java.lang.Enum
....
....
....
{
public static final com.taobao.tianxiao.FruitEnum APPLE;
public static final com.taobao.tianxiao.FruitEnum ORAGE;
static {};
Code:
Stack=4, Locals=0, Args_size=0
0: new #1; //class com/taobao/tianxiao/FruitEnum
3: dup
4: ldc #13; //String APPLE
6: iconst_0
7: invokespecial #14; //Method "<init>":(Ljava/lang/String;I)V
10: putstatic #18; //Field APPLE:Lcom/taobao/tianxiao/FruitEnum;
13: new #1; //class com/taobao/tianxiao/FruitEnum
16: dup
17: ldc #20; //String ORAGE
19: iconst_1
20: invokespecial #14; //Method "<init>":(Ljava/lang/String;I)V
23: putstatic #21; //Field ORAGE:Lcom/taobao/tianxiao/FruitEnum;
26: iconst_2
27: anewarray #1; //class com/taobao/tianxiao/FruitEnum
30: dup
31: iconst_0
32: getstatic #18; //Field APPLE:Lcom/taobao/tianxiao/FruitEnum;
35: aastore
36: dup
37: iconst_1
38: getstatic #21; //Field ORAGE:Lcom/taobao/tianxiao/FruitEnum;
41: aastore
42: putstatic #23; //Field ENUM$VALUES:[Lcom/taobao/tianxiao/FruitEnum;
45: return
LineNumberTable:
line 4: 0
line 3: 26
public static com.taobao.tianxiao.FruitEnum[] values();
Code:
Stack=5, Locals=3, Args_size=0
0: getstatic #23; //Field ENUM$VALUES:[Lcom/taobao/tianxiao/FruitEnum;
3: dup
4: astore_0
5: iconst_0
6: aload_0
7: arraylength
8: dup
9: istore_1
10: anewarray #1; //class com/taobao/tianxiao/FruitEnum
13: dup
14: astore_2
15: iconst_0
16: iload_1
17: invokestatic #31; //Method java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V
20: aload_2
21: areturn
LineNumberTable:
line 1: 0
public static com.taobao.tianxiao.FruitEnum valueOf(java.lang.String);
Code:
Stack=2, Locals=1, Args_size=1
0: ldc #1; //class com/taobao/tianxiao/FruitEnum
2: aload_0
3: invokestatic #39; //Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
6: checkcast #1; //class com/taobao/tianxiao/FruitEnum
9: areturn
LineNumberTable:
line 1: 0
}
上面的字节码已经去掉的常量池部分,但是即便如此,在我们的源代码中如此简单的一个FruitEnum类,编译器居然为我们产生了这么多的字节码,哇哦~~~~~~~~
仔细地看这段代码, 编译器是在为我们创建一个类,这个类继承自 java.lang.Enum ,有两个公共的、静态的、被声明成final的属性,它们的类型就是我们定义的FruitEnum。同时,编译器还生成了一个静态初始话器,就是字节码中static{};这一行下面的代码,其中的字节码创建了两个FruitEnum对象,同时分别赋值给APPLE和ORANGE这两个属性,调用的构造函数是定义在 java.lang.Enum中的protected Enum(String name, int ordinal)方法。在创建完成两个FruitEnum对象并且分别赋值给APPLE和ORIGIN之后,还创建了一个名叫ENUM$VALUES的数组,然后把APPLE和ORIGIN按照定义的顺序放如这个数组中。
除了这个静态初始化器之外,编译器还为我们生成了两个静态方法,values()和 valueOf(java.lang.String)方法。其中values()方法将ENUM$VALUES数组拷贝一份然后返回,而valueOf(java.lang.String)方法则会调用java.lang.Enum类中的valueOf方法,其作用是根据参数名找到对应的具体的枚举对象,如果找不到的话会抛出一个IllegalArgumentException异常。
从上面的叙述可以看到,我们定义的枚举类型,经过编译器的处理最终会编程一个对象的定义,其中的枚举变量其实就是类的静态变量,因此Java中的枚举类型其实是具有很多对象的特性的,只不过平时我们都不太用到,比如枚举可以实现接口(不能继承)、定义方法等等。为了保证枚举类型像Java规范中所说的那样,每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,在枚举类型的序列化和反序列化上,Java做了特殊的规定。原文如下(摘自Java的序列化规范):
引用
Enum constants are serialized differently than ordinary serializable or externalizable objects. The serialized form of an enum constant consists solely of its name; field values of the constant are not present in the form. To serialize an enum constant, ObjectOutputStream writes the value returned by the enum constant's name method. To deserialize an enum constant, ObjectInputStream reads the constant name from the stream; the deserialized constant is then obtained by calling the java.lang.Enum.valueOf method, passing the constant's enum type along with the received constant name as arguments. Like other serializable or externalizable objects, enum constants can function as the targets of back references appearing subsequently in the serialization stream.
The process by which enum constants are serialized cannot be customized: any class-specific writeObject, readObject, readObjectNoData, writeReplace, and readResolve methods defined by enum types are ignored during serialization and deserialization. Similarly, any serialPersistentFields or serialVersionUID field declarations are also ignored--all enum types have a fixedserialVersionUID of 0L. Documenting serializable fields and data for enum types is unnecessary, since there is no variation in the type of data sent.
大概意思就是说,在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。下面我们来看看反序列化时候被调用的那个valueOf方法长什么样子。
java代码:
Java代码 收藏代码
public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum const " + enumType +"." + name);
}
从代码中可以看到,代码会尝试从调用enumType这个Class对象的enumConstantDirectory()方法返回的map中获取名字为name的枚举对象,如果不存在就会抛出异常。再进一步跟到enumConstantDirectory()方法,就会发现到最后会以反射的方式调用enumType这个类型的values()静态方法,也就是上面我们看到的编译器为我们创建的那个方法,然后用返回结果填充enumType这个Class对象中的enumConstantDirectory属性。
在了解了Java如何处理枚举的定义以及序列化和反序列化枚举类型之后,我们就需要在系统或者类库升级时,对其中定义的枚举类型多加注意,为了保持代码上的兼容性,如果我们定义的枚举类型有可能会被序列化保存(放到文件中、保存到数据库中,进入分布式内存缓存中),那么我们是不能够删除原来枚举类型中定义的任何枚举对象的,否则程序在运行过程中,JVM就会抱怨找不到与某个名字对应的枚举对象了。另外,在远程方法调用过程中,如果我们发布的客户端接口返回值中使用了枚举类型,那么服务端在升级过程中就需要特别注意。如果在接口的返回结果的枚举类型中添加了新的枚举值,那就会导致仍然在使用老的客户端的那些应用出现调用失败的情况。因此,针对以上两种情况,应该尽量避免使用枚举,如果实在要用,也需要仔细设计,因为一旦用了枚举,有可能会给后期维护带来隐患。
评:
大概意思就是说,在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中
enum内部变量 不能被序列化进去
在Java中,对Enum类型的序列化与其他对象类型的序列化有所不同,今天就来看看到底有什么不同。下面先来看下在Java中,我们定义的Enum在被编译之后是长成什么样子的。
Java代码:
Java代码 收藏代码
public enum FruitEnum {
APPLE, ORAGE
}
上面的代码定义了一个FruitEnum类型,是最简单形式的,下面我们来看看编译之后的字节码。
字节码:
Java代码 收藏代码
public final class com.taobao.tianxiao.FruitEnum extends java.lang.Enum
....
....
....
{
public static final com.taobao.tianxiao.FruitEnum APPLE;
public static final com.taobao.tianxiao.FruitEnum ORAGE;
static {};
Code:
Stack=4, Locals=0, Args_size=0
0: new #1; //class com/taobao/tianxiao/FruitEnum
3: dup
4: ldc #13; //String APPLE
6: iconst_0
7: invokespecial #14; //Method "<init>":(Ljava/lang/String;I)V
10: putstatic #18; //Field APPLE:Lcom/taobao/tianxiao/FruitEnum;
13: new #1; //class com/taobao/tianxiao/FruitEnum
16: dup
17: ldc #20; //String ORAGE
19: iconst_1
20: invokespecial #14; //Method "<init>":(Ljava/lang/String;I)V
23: putstatic #21; //Field ORAGE:Lcom/taobao/tianxiao/FruitEnum;
26: iconst_2
27: anewarray #1; //class com/taobao/tianxiao/FruitEnum
30: dup
31: iconst_0
32: getstatic #18; //Field APPLE:Lcom/taobao/tianxiao/FruitEnum;
35: aastore
36: dup
37: iconst_1
38: getstatic #21; //Field ORAGE:Lcom/taobao/tianxiao/FruitEnum;
41: aastore
42: putstatic #23; //Field ENUM$VALUES:[Lcom/taobao/tianxiao/FruitEnum;
45: return
LineNumberTable:
line 4: 0
line 3: 26
public static com.taobao.tianxiao.FruitEnum[] values();
Code:
Stack=5, Locals=3, Args_size=0
0: getstatic #23; //Field ENUM$VALUES:[Lcom/taobao/tianxiao/FruitEnum;
3: dup
4: astore_0
5: iconst_0
6: aload_0
7: arraylength
8: dup
9: istore_1
10: anewarray #1; //class com/taobao/tianxiao/FruitEnum
13: dup
14: astore_2
15: iconst_0
16: iload_1
17: invokestatic #31; //Method java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V
20: aload_2
21: areturn
LineNumberTable:
line 1: 0
public static com.taobao.tianxiao.FruitEnum valueOf(java.lang.String);
Code:
Stack=2, Locals=1, Args_size=1
0: ldc #1; //class com/taobao/tianxiao/FruitEnum
2: aload_0
3: invokestatic #39; //Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
6: checkcast #1; //class com/taobao/tianxiao/FruitEnum
9: areturn
LineNumberTable:
line 1: 0
}
上面的字节码已经去掉的常量池部分,但是即便如此,在我们的源代码中如此简单的一个FruitEnum类,编译器居然为我们产生了这么多的字节码,哇哦~~~~~~~~
仔细地看这段代码, 编译器是在为我们创建一个类,这个类继承自 java.lang.Enum ,有两个公共的、静态的、被声明成final的属性,它们的类型就是我们定义的FruitEnum。同时,编译器还生成了一个静态初始话器,就是字节码中static{};这一行下面的代码,其中的字节码创建了两个FruitEnum对象,同时分别赋值给APPLE和ORANGE这两个属性,调用的构造函数是定义在 java.lang.Enum中的protected Enum(String name, int ordinal)方法。在创建完成两个FruitEnum对象并且分别赋值给APPLE和ORIGIN之后,还创建了一个名叫ENUM$VALUES的数组,然后把APPLE和ORIGIN按照定义的顺序放如这个数组中。
除了这个静态初始化器之外,编译器还为我们生成了两个静态方法,values()和 valueOf(java.lang.String)方法。其中values()方法将ENUM$VALUES数组拷贝一份然后返回,而valueOf(java.lang.String)方法则会调用java.lang.Enum类中的valueOf方法,其作用是根据参数名找到对应的具体的枚举对象,如果找不到的话会抛出一个IllegalArgumentException异常。
从上面的叙述可以看到,我们定义的枚举类型,经过编译器的处理最终会编程一个对象的定义,其中的枚举变量其实就是类的静态变量,因此Java中的枚举类型其实是具有很多对象的特性的,只不过平时我们都不太用到,比如枚举可以实现接口(不能继承)、定义方法等等。为了保证枚举类型像Java规范中所说的那样,每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,在枚举类型的序列化和反序列化上,Java做了特殊的规定。原文如下(摘自Java的序列化规范):
引用
Enum constants are serialized differently than ordinary serializable or externalizable objects. The serialized form of an enum constant consists solely of its name; field values of the constant are not present in the form. To serialize an enum constant, ObjectOutputStream writes the value returned by the enum constant's name method. To deserialize an enum constant, ObjectInputStream reads the constant name from the stream; the deserialized constant is then obtained by calling the java.lang.Enum.valueOf method, passing the constant's enum type along with the received constant name as arguments. Like other serializable or externalizable objects, enum constants can function as the targets of back references appearing subsequently in the serialization stream.
The process by which enum constants are serialized cannot be customized: any class-specific writeObject, readObject, readObjectNoData, writeReplace, and readResolve methods defined by enum types are ignored during serialization and deserialization. Similarly, any serialPersistentFields or serialVersionUID field declarations are also ignored--all enum types have a fixedserialVersionUID of 0L. Documenting serializable fields and data for enum types is unnecessary, since there is no variation in the type of data sent.
大概意思就是说,在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。下面我们来看看反序列化时候被调用的那个valueOf方法长什么样子。
java代码:
Java代码 收藏代码
public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum const " + enumType +"." + name);
}
从代码中可以看到,代码会尝试从调用enumType这个Class对象的enumConstantDirectory()方法返回的map中获取名字为name的枚举对象,如果不存在就会抛出异常。再进一步跟到enumConstantDirectory()方法,就会发现到最后会以反射的方式调用enumType这个类型的values()静态方法,也就是上面我们看到的编译器为我们创建的那个方法,然后用返回结果填充enumType这个Class对象中的enumConstantDirectory属性。
在了解了Java如何处理枚举的定义以及序列化和反序列化枚举类型之后,我们就需要在系统或者类库升级时,对其中定义的枚举类型多加注意,为了保持代码上的兼容性,如果我们定义的枚举类型有可能会被序列化保存(放到文件中、保存到数据库中,进入分布式内存缓存中),那么我们是不能够删除原来枚举类型中定义的任何枚举对象的,否则程序在运行过程中,JVM就会抱怨找不到与某个名字对应的枚举对象了。另外,在远程方法调用过程中,如果我们发布的客户端接口返回值中使用了枚举类型,那么服务端在升级过程中就需要特别注意。如果在接口的返回结果的枚举类型中添加了新的枚举值,那就会导致仍然在使用老的客户端的那些应用出现调用失败的情况。因此,针对以上两种情况,应该尽量避免使用枚举,如果实在要用,也需要仔细设计,因为一旦用了枚举,有可能会给后期维护带来隐患。
发表评论
-
BeanCopier系列之一:特性测试
2018-06-12 12:15 431源:http://czj4451.iteye.com/ ... -
Lombok 之 ToString
2018-03-20 19:35 650源:http://himichaelchu.iteye.com ... -
锂电池与镍镉电池有什么区别
2018-03-01 17:20 469源:http://www.cnblogs.com/sk ... -
extends和super的区别
2018-01-14 19:05 588源:http://bbs.csdn.net/topics/38 ... -
Mac OS X 11中的/usr/bin 的“Operation not permitted”
2017-09-21 20:42 1603源:http://www.jianshu.com/p/22b8 ... -
double转BigDecimal,数变大
2017-09-09 14:02 611源:http://blog.csdn.net/linbrain ... -
maven打包 含src下的xml文件
2016-08-02 13:09 423源:http://bbs.csdn.net/topics/37 ... -
循环依赖检测方法 spring源码方法
2016-07-06 18:58 1165场景:checkForAliasCircle(name, al ... -
开源许可证之间区别
2016-04-27 18:34 535源:http://www.ruanyifeng.com/blo ... -
数据简报:上证综合指数历史走势图(1991年以来)
2016-04-15 12:05 1180源:http://intl.ce.cn/specials/zx ... -
java.net.URISyntaxException: Illegal character in hostname at
2016-04-06 16:41 8751、通过hostname命令。 临时修改hostname ... -
Oracle模糊查询之(4.采用全文索引解决模糊查询,给出具体步骤)采用全文索引解决模糊查询速度慢的问题[主文]
2016-03-24 16:16 850源:http://blog.csdn.net/haiross/ ... -
理解和正确使用Java中的断言(assert)
2016-03-24 15:55 1076源:http://blog.csdn.net/leic ... -
string stringbuffer stringbuilder区别
2016-03-07 15:39 452string 是不可变类,内部数据结构为final char数 ... -
接口和抽象类有什么区别
2015-11-27 15:58 433源:http://m.blog.csdn.net/bl ... -
serialVersionUID的作用
2015-11-08 15:27 579源:http://www.cnblogs.com/gu ... -
dom4j写xml时&会被转义成&的解决方法?
2015-09-08 20:52 983源:http://www.iteye.com/problems ... -
java ImageIO处理图像的封装
2015-09-06 10:17 364源:http://blog.csdn.net/hu_sheng ... -
XML 和 java对象相互转换
2015-08-17 16:45 0源:http://hbiao68.iteye.com/blog ... -
java 版本更迭
2015-08-03 10:19 601源:https://en.wikipedia.org/wiki ...
相关推荐
总结来说,Java枚举类型提供了一种安全、类型安全的方式来定义和使用常量,它可以拥有构造器、方法和字段,并能与switch语句、序列化、反射等Java特性很好地结合。理解并熟练使用枚举,能够使代码更加清晰、易读,...
在Java编程中,枚举类型(Enum)是一种强大的工具,用于定义一组预定义的常量。然而,在使用Gson库进行JSON序列化和反序列化时,枚举处理默认方式可能无法满足所有需求。本篇文章将详细探讨如何通过自定义Gson适配器...
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
Java中的枚举(enum)类型是在JDK 1.5版本引入的一个强大的特性,它用于定义一组相关的常量。在C/C++等语言中,枚举通常用来表示一组具有固定值的常量集合,但在Java中,枚举不仅限于此,它提供了更多的功能和灵活性...
Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的类型,它用于定义固定的、不可变的值集合。枚举类型是`java.lang.Enum`抽象类的子类,提供了一种安全且类型化的常量表示方式。下面我们将深入探讨enum的使用...
如果不想让枚举实例被序列化,可以在枚举类型上实现`Serializable`接口并添加`transient`关键字: ```java public enum Shape implements Serializable { // ... private transient double constant; // ... } ...
Java中的枚举(enum)类型是在JDK 1.5版本引入的一种强大的特性,它用于定义一组相关的常量。在C/C++等早期语言中,枚举通常是一种基本的数据类型,而在Java中,枚举是一种类,具有更多的功能和灵活性。 1. **什么...
这需要编写额外的序列化和反序列化代码,但能提供更好的性能。 ```java public enum MyParcelableEnum implements Parcelable { VALUE1, VALUE2; public static final Creator<MyParcelableEnum> CREATOR = new...
根据提供的文件信息,这里将详细解释Java中的枚举(enum)类型,并且深入探讨其用法、特性以及在实际编程中的应用。 ### Java中的枚举(enum) #### 1. 枚举概述 枚举(enum)是Java 1.5版本引入的一种新数据类型...
在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义一组固定的常量。枚举类型在很多情况下被用来表示有限的、已知的、不可变的数据集合,比如颜色、星期、方向等。本篇文章将深入探讨Java中的枚举(Enum)的...
- `Gender`枚举类型是可序列化的,因为`java.lang.Enum`默认实现了`Serializable`接口。 - `Person`类包含了三个字段,`name`、`age`和`gender`,并且实现了`Serializable`接口,因此它可以被序列化。 - `Simple...
在Spring Boot应用中,Fastjson是一个非常常用的JSON处理库,由阿里巴巴开发,它提供了高效的序列化和反序列化功能。本示例项目"springboot-fastjson-auto-transform-enum.zip"显然是关于如何在Spring Boot中利用...
本文将深入探讨如何利用Gson库进行多枚举类型的统一序列化和反序列化处理,以此避免为每个枚举类型单独创建Adapter。 首先,我们需要了解Gson的基本用法。Gson的核心类是`Gson`,它提供了`toJson()`和`fromJson()`...
在 Java 中,枚举类型可以序列化,因为它继承了 java.lang.Enum 类,该类实现了 Serializable 接口。这意味着,我们可以将枚举类型对象转换为字节序列,以便进行传输。 在示例代码中,我们创建了一个枚举类 ...
在JDBC中,反射常用于动态调用数据库表对应的实体类的getter和setter方法,实现数据的序列化和反序列化。例如,根据字段名获取并设置对象属性: ```java Field field = entity.getClass().getField(fieldName); ...
但是,如果不需要枚举实例被序列化,可以通过在枚举类上添加`@java.io.Serializable`注解并覆盖`writeObject()`和`readObject()`方法来禁用序列化。 11. **枚举与反射** 通过反射,可以获取枚举类的所有常量、字段...
在Spring Boot应用中,Jackson库通常用于JSON的序列化与反序列化,使得Java对象能够被转换成JSON格式,反之亦然。Jackson自定义序列化和反序列化是提高灵活性和控制JSON转换过程的关键功能。当涉及到枚举类型(enum...
代码中包含枚举类的基本使用,和完整的请求示例。 主要实现了枚举类创建单例后,将结果返回给前端。 看过一些其他人的实现,都比较麻烦。这是结合一些博主的代码,摸索出来的比较方便的方案。 缺点就是 多线程下会...
6. **枚举的序列化和反序列化**:如果枚举在序列化和反序列化过程中使用,要确保这个过程能够正确无误地进行。 在"TestEnum"这个文件中,我们可以期待看到一个测试用例集,它针对某个枚举类型进行了上述测试策略的...
在Java开发中,枚举类型(Enum)常用于表示固定数量的状态或选项,以替代硬编码的常量,提供更好的可读性和类型安全。Jackson是一个流行的JSON处理库,它允许我们将Java对象序列化为JSON格式,反之亦然。在序列化...