fastjson 在序列化protobuf过程中的问题

ubby3x7f  于 2021-11-27  发布在  Java
关注(0)|答案(2)|浏览(388)

版本 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);
        }
.......
}

现在这解决办法而且一旦一个类有问题就得替换成新的类,希望能有正式的解决办法

mkshixfv

mkshixfv2#

使用fastjson 转google的Protobuf 还会有其他的问题,填不完,主要是Protobut里面的方法和结构很奇怪,现在已经放弃使用fastJson转protobuf了,google的东西还是用他自家的Gson转好了

相关问题