字符串与Java对象的互转
- 对象序列化机制:允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。
- 序列化操作的对象需要实现Serializable或Externalizable,并且其内部所有属性也必须是可序列化的(String和StringBuilder类已实现了Serializable,基本数据类型默认可序列化),因为static和transient修饰的成员变量,不会被操作,所以不能序列化。
- 一般都是把对象转为josn格式进行序列化
自定义类举例:
1 | import lombok.AllArgsConstructor; |
FastJSON
引入依赖:
1 | <!-- json与对象互转--> |
测试使用:
1 | import org.junit.Test; |
Jackson
1 | <dependency> |
测试使用:
1 | import org.junit.Test; |
Gson
1 | <dependency> |
测试使用:
1 | import com.google.gson.Gson; |
后记
- 使用FastJSON序列化时,栈内存溢出:原因:需要被反序列化的实体类继承了一个类(DataEntity),该类中的一个递归方法陷入了死循环,最终导致栈内存溢出
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
29java.lang.StackOverflowError: null
at org.nustaq.serialization.FSTObjectInput$2.readObjectOverride(FSTObjectInput.java:1030)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
at org.nustaq.serialization.FSTObjectInput$MyObjectStream.readObjectOverride(FSTObjectInput.java:1353)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
at java.util.HashMap.readObject(HashMap.java:1396)
at sun.reflect.GeneratedMethodAccessor174.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.nustaq.serialization.FSTObjectInput.readObjectCompatibleRecursive(FSTObjectInput.java:609)
at org.nustaq.serialization.FSTObjectInput.readObjectCompatibleRecursive(FSTObjectInput.java:598)
at org.nustaq.serialization.FSTObjectInput.readObjectCompatibleRecursive(FSTObjectInput.java:598)
at org.nustaq.serialization.FSTObjectInput.readObjectCompatible(FSTObjectInput.java:574)
at org.nustaq.serialization.FSTObjectInput.instantiateAndReadNoSer(FSTObjectInput.java:559)
at org.nustaq.serialization.FSTObjectInput.readObjectWithHeader(FSTObjectInput.java:374)
at org.nustaq.serialization.FSTObjectInput.readObjectFields(FSTObjectInput.java:713)
at org.nustaq.serialization.FSTObjectInput.instantiateAndReadNoSer(FSTObjectInput.java:566)
at org.nustaq.serialization.FSTObjectInput.readObjectWithHeader(FSTObjectInput.java:374)
at org.nustaq.serialization.FSTObjectInput.readObjectInternal(FSTObjectInput.java:331)
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:311)
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:245)
at org.nustaq.serialization.FSTConfiguration.asObject(FSTConfiguration.java:1158)
at com.jeesite.common.lang.ObjectUtils.unserializeFst(ObjectUtils.java:242)
at com.jeesite.common.lang.ObjectUtils.cloneBean(ObjectUtils.java:259)
at com.jeesite.common.entity.BaseEntity.clone(dk:489)
at com.jeesite.modules.sys.utils.UserUtils.get(nd:7)
at com.jeesite.modules.sys.utils.UserUtils.getUser(nd:396)
at com.jeesite.common.entity.BaseEntity.getCurrentUser(dk:542)
at com.alibaba.fastjson.serializer.ASMSerializer_2_User.write(Unknown Source)
经过多方调试后发现,类(DataEntity
)中的(getCurrentUser()
)方法的currentUser
属性在递归中一直都是null
,最终导致栈内存溢出。
(我的)解决方法:将FastJSON替换为Jackson;
替换后再次调试,发现currentUser
属性被成功赋值
评论