版本 1.2.56
在解析protobuf对象的时候发生了stackoverflowError
,通过debug 发现其中解析protobuf
自动生成的
1 --->Descriptors.FileDescriptor中的属性
2 --->Descriptors.Descriptor[] messageTypes数组其中的一个对象中的属性
3 --->Descriptors.FileDescriptor file又再次引用了1,
但是fastjson并没有判断出这是循环引用,所以报出了异常。
我暂时复制了JSON这个类,改写里面的方法
public static Object toJSON(Object javaObject, SerializeConfig config, ArrayList<Object> objs) {
//如果对象被序列化过则不再序列化
for (Object obj : objs) {
if (obj == javaObject) {
return "";
}
}
objs.add(javaObject);
.........
}
还有在protobuf 中的对象比如 FieldDescriptor 经常会定义一些get方法的代码如下
public Object getDefaultValue() {
if (this.getJavaType() == Descriptors.FieldDescriptor.JavaType.MESSAGE) {
throw new UnsupportedOperationException("FieldDescriptor.getDefaultValue() called on an embedded message field.");
} else {
return this.defaultValue;
}
}
这样的方法会报出异常,导致toJSON失败,试过反射替换FieldSerializer 中的 fieldInfo 字段为一个可以正常访问的字段发现竟然还是final的,现在暂时使用的是做了一个属性完全一样的bean来替换
public static Object toJSON(Object javaObject, SerializeConfig config, ArrayList<Object> objs) {
//解决循环引用
........
//替换掉会引起get错误的字段
if (javaObject instanceof Descriptors.FieldDescriptor) {
javaObject = PBSecondsBugReplace.from((Descriptors.FieldDescriptor)javaObject);
}
.......
}
现在这解决办法而且一旦一个类有问题就得替换成新的类,希望能有正式的解决办法
2条答案
按热度按时间nkoocmlb1#
+1 相同的问题
mkshixfv2#
使用fastjson 转google的Protobuf 还会有其他的问题,填不完,主要是Protobut里面的方法和结构很奇怪,现在已经放弃使用fastJson转protobuf了,google的东西还是用他自家的Gson转好了