首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Gson将对象序列化为瞬态字段

使用Gson将对象序列化为瞬态字段
EN

Stack Overflow用户
提问于 2021-12-11 19:21:12
回答 2查看 376关注 0票数 0

我正在尝试将一个对象转换为具有InetSocketAddress实例作为属性的JSON。InetSocketAdress中的holder属性被标记为瞬态属性,因此在序列化到JSON时会被Gson忽略。

由于InetSocketAddress类是内置到java.net中的,所以我无法删除瞬态关键字。

我还尝试将excludeFieldsWithModifiers()用于transientstatic修饰符:

代码语言:javascript
复制
final Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).create();
String json = gson.toJson(registration, Registration.class);

这会产生以下错误:

代码语言:javascript
复制
java.lang.reflect.InaccessibleObjectException: Unable to make field private static final long java.net.InetSocketAddress.serialVersionUID accessible: module java.base does not "opens java.net" to unnamed module @3e849b9e
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
    at com.google.gson.internal.reflect.UnsafeReflectionAccessor.makeAccessible(UnsafeReflectionAccessor.java:44)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:159)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at com.google.gson.Gson.getAdapter(Gson.java:489)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at com.google.gson.Gson.getAdapter(Gson.java:489)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at com.google.gson.Gson.getAdapter(Gson.java:489)
    at com.google.gson.Gson.toJson(Gson.java:727)
    at com.google.gson.Gson.toJson(Gson.java:714)
    at com.google.gson.Gson.toJson(Gson.java:669)
    at org.eclipse.leshan.server.demo.websocket.WebSocketClient$1.registered(WebSocketClient.java:61)
    at org.eclipse.leshan.server.registration.RegistrationServiceImpl.fireRegistered(RegistrationServiceImpl.java:74)
    at org.eclipse.leshan.server.registration.RegistrationHandler$1.run(RegistrationHandler.java:86)
    at org.eclipse.leshan.core.response.SendableResponse.sent(SendableResponse.java:47)
    at org.eclipse.leshan.server.californium.registration.RegisterResource.handleRegister(RegisterResource.java:195)
    at org.eclipse.leshan.server.californium.registration.RegisterResource.handlePOST(RegisterResource.java:104)
    at org.eclipse.californium.core.CoapResource.handleRequest(CoapResource.java:219)
    at org.eclipse.leshan.core.californium.LwM2mCoapResource.handleRequest(LwM2mCoapResource.java:51)
    at org.eclipse.californium.core.server.ServerMessageDeliverer.deliverRequest(ServerMessageDeliverer.java:106)
    at org.eclipse.californium.core.network.stack.BaseCoapStack$StackTopAdapter.receiveRequest(BaseCoapStack.java:207)
    at org.eclipse.californium.core.network.stack.AbstractLayer.receiveRequest(AbstractLayer.java:84)
    at org.eclipse.californium.core.network.stack.AbstractLayer.receiveRequest(AbstractLayer.java:84)
    at org.eclipse.californium.core.network.stack.BlockwiseLayer.receiveRequest(BlockwiseLayer.java:488)
    at org.eclipse.californium.core.network.stack.ReliabilityLayer.receiveRequest(ReliabilityLayer.java:296)
    at org.eclipse.californium.core.network.stack.AbstractLayer.receiveRequest(AbstractLayer.java:84)
    at org.eclipse.californium.core.network.stack.BaseCoapStack.receiveRequest(BaseCoapStack.java:140)
    at org.eclipse.californium.core.network.CoapEndpoint$1.receiveRequest(CoapEndpoint.java:302)
    at org.eclipse.californium.core.network.UdpMatcher$2.run(UdpMatcher.java:289)
    at org.eclipse.californium.elements.util.SerialExecutor$1.run(SerialExecutor.java:290)
    at org.eclipse.californium.core.network.CoapEndpoint$6.run(CoapEndpoint.java:1311)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2021-12-11 19:33:45

真正的问题是gson库内部使用反射策略访问私有字段。在java 9和更高版本中,您不允许使用反射访问私有信息。

一个可能的解决方案是,检查您正在使用的java版本。如果是Java 9或更高版本,那么尝试降级为java 8。

票数 0
EN

Stack Overflow用户

发布于 2021-12-12 04:51:06

这里的根本问题是,您正在(隐式地)使用基于反射的Gson类型适配器来处理第三方类(在本例中是JDK类)的私有字段。通过这种方式,您可以依赖于该类的实现细节,这在任何时候都可能发生更改,或者如这里所示,可能变得不可访问。

这里的“正确”和未来的解决方案是为TypeAdapter类编写一个自定义的InetSocketAdress

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

https://stackoverflow.com/questions/70318293

复制
相关文章

相似问题

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