首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GSON无法用Java 17序列化异常

GSON无法用Java 17序列化异常
EN

Stack Overflow用户
提问于 2021-12-16 09:04:09
回答 2查看 2.5K关注 0票数 2

用于Java 11的下列代码:

代码语言:javascript
复制
new Gson().toJson(new Exception())

在JDK 17上,我得到以下错误:

代码语言:javascript
复制
Unable to make field private java.lang.String java.lang.Throwable.detailMessage accessible: module java.base does not "opens java.lang" to unnamed module @147ed70f

通过阅读此页,我想我可以用--add-opens java.base/java.lang=ALL-UNNAMED来解决它。但是,有更好的方法吗?也许是用定制的反/序列化器?

EN

回答 2

Stack Overflow用户

发布于 2022-01-11 23:55:22

下面是我为反序列化异常添加的代码。这可以在这样的类中使用:

代码语言:javascript
复制
public class Result {
    public final Object result;
    public final Error error;

    public Result(Object result) { ... }

    public Result(Exception e) {
        this.result = null;
        this.error = new Error(e);
    }
}

另一方面,打电话给result.error.toThrowable()

代码语言:javascript
复制
public static class Error {
    public final String message;
    public final List<STE> stackTrace;
    public final Error cause;

    public Error(Throwable e) {
        message = e.getMessage();
        stackTrace = Arrays.stream(e.getStackTrace()).map(STE::new).collect(Collectors.toList());
        cause = e.getCause() != null ? new Error(e.getCause()) : null;
    }

    public Throwable toThrowable() {
        Throwable t = new Throwable(message);
        t.setStackTrace(stackTrace.stream().map(STE::toStackTraceElement).toArray(StackTraceElement[]::new));
        if (cause != null) {
            t.initCause(cause.toThrowable());
        }
        return t;
    }

    private static class STE {
        public final String declaringClass;
        public final String methodName;
        public final String fileName;
        public final int    lineNumber;

        public STE(StackTraceElement ste) {
            this.declaringClass = ste.getClassName();
            this.methodName = ste.getMethodName();
            this.fileName = ste.getFileName();
            this.lineNumber = ste.getLineNumber();
        }

        public StackTraceElement toStackTraceElement() {
            return new StackTraceElement(declaringClass, methodName, fileName, lineNumber);
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2022-02-07 04:23:12

我昨天有这个。我使用了Java 17,我回到了Java 11,它运行得很好。

我想是因为这个:https://bugs.openjdk.java.net/browse/JDK-8256358

我很懒,并且使用GSON默认的反射类型适配器。

您必须实现自己的TypeAdapter来修复它。或者使用另一个JSON反序列化器,比如Jackson,我稍后可能会这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70376339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档