1
sagaxu 2017-07-09 12:21:20 +08:00
json 不可能保存对象类型,json 反序列化的时候,你不是自己可以指定对象类型吗?
|
2
slixurd 2017-07-09 12:21:54 +08:00
这个难道不是优势么....
JSON 反序列化只要显式指定反序列化的 Class Reference,就可以被反序列化 JDK 的 Serializable 最大的问题就是需要匹配上 Full-qualified name..... 还有需要通过 Version ID 来判断版本,否则会错位.... |
3
wwqgtxx 2017-07-09 12:44:04 +08:00 via iPhone
主要是因为 json 很多的用在跨语言序列化中,要是保存了类型,怎么跨语言呢,难道再根据类型给各个语言实例化一个版本?
|
4
yinzhili 2017-07-09 12:45:44 +08:00
json 跨语言的啊,不同语言的类型都不一样,没法指定。
|
5
miao1007 2017-07-09 13:41:38 +08:00 via Android
楼主需要 RPC 中的 SDL
|
6
0915240 2017-07-09 13:45:18 +08:00
序列化的时候不可能保存对象类型啊
所以你需要在反序列化的时候去指定啊,恩,没毛病。 |
7
DeadLion 2017-07-09 15:45:55 +08:00
最近在用 dubbo 的时候也发现了这个问题
消费方对于嵌套泛型无法准确反序列化 使用 json 做序列化的时候 不过楼上有人说了,使用 Class Reference 就可以转成指定的对象了。 |
8
zjsxwc 2017-07-09 15:56:52 +08:00
可以自定制个 json 类型(某个字段包含对象的类型),以及对应的序列化与反序列化方法
其实楼主的需求最好还是用 xml 来表示,序列化可以先把对象转换为 xml 对象再转 json ; 反序列化先转为 xml 对象再转为实际对象。 |
9
decken 2017-07-09 16:07:27 +08:00 via iPhone
fastjson 有这个特性
|
11
wenzhoou 2017-07-10 07:55:13 +08:00 via Android
|
12
abcbuzhiming OP |
13
abcbuzhiming OP |
14
abcbuzhiming OP @slixurd 无意中发出去了,我遇到的情况是这样的类型
public class XXXXX{ private AAA aaa; //这个 AAA 是个 interface private Map<Object, Object> attributes; } jasckson 序列化这个类的对象时没有问题,但是反序列化 json 字符串到这个 XXXXX 类的时候就会吃瘪,而且这个 XXXXX 类似别人定义的,我没法改 |
15
meepo3927 2017-07-10 10:29:33 +08:00
json 源于描述 javascript 的对象和数据,而后广泛应用。
所以,json 本身肯定不携带 Class 咯 |
16
wenzhoou 2017-07-10 11:32:04 +08:00 via Android
这个 AAA 的实现类是固定的 AAAImpl , 还是 根据情况分为 AAAa 和 AAAb 的不同实现类?
|
17
abcbuzhiming OP @wenzhoou 多个,不同的实现类,而且这只是其中一个困扰点,
另外一个 private Map<Object, Object> attributes;这个困扰点很麻烦,我发现 jackson 对反序列化 Map<String, Object>存在漏洞,什么都不设定的情况下,它把 Object 全部当 LinkHashMap 来处理,但是如果提供的字符串内容中有类似"[111,222,333]"这样的数组结构,它还是按 Map 处理,然后直接就抛异常 |
18
wenzhoou 2017-07-10 18:34:48 +08:00 via Android
根据不同的情况分不同的实现类的话。如果用我链接的方法不行的话。你需要直接转成 map 然后自己根据情况,把 map 再转成对应的类。暂时没别的想法。
|
19
decken 2017-07-10 19:46:12 +08:00
@meowu #10 能举个例子吗? 我用着一直没遇到啥大问题, 除了上次 1.2.29 修复安全漏洞, 限制了 autoType 对某些老版本在特定 case 下不兼容
|
20
woshixiaohao1982 2017-07-23 15:32:51 +08:00
@slixurd 序列化版本可以方便缓存部分失效,例如你发布了新版的程序,这样旧版留存的对象保存在 redis 里面就自动失效了
|