Java:在Applet中使用Gson会导致SecurityException

我正在尝试在我的Java Applet中使用Google Gson,但是当我这样做时,我得到了

线程“Thread-19”中的exceptionjava.security.AccessControlException:在java.security.AccessController.checkPermission上的java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)中访问被拒绝(java.lang.reflect.ReflectPermission suppressAccessChecks)( AccessController.java:546)java.lang.SecurityManager.checkPermission(SecurityManager.java:532)at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:74)at com.google.gson.MappedObjectConstructor.getNoArgsConstructor(MappedObjectConstructor) .java:85)com.google.gson.MapedObjectConstructor.constructWithNoArgConstructor(MappedObjectConstructor.java:62)com.google.gson.MappedObjectConstructor.construct(MappedObjectConstructor.java:53)com.google.gson.JsonObjectDeserializationVisitor.constructTarget( JsonObjectDeserializationVisitor.java:40)com.google.gson.JonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:56)com.google.gson.ObjectNavigator.accept(ObjectNavigat) or.java:109)com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73)com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:51)com.google.gson.Gson.fromJson (gson.java:495)com.google.gson.Gson.fromJson(Gson.java:444)com.google.gson.Gson.fromJson(Gson.java:396)com.google.gson.Gson。 fromjson(Gson.java:372)org.jblux.client.network.GsonParser $ 1.run(GsonParser.java:32)at org.jblux.client.network.GsonParser的java.security.AccessController.doPrivileged(Native Method)位于org.jblux.client.network.PlayerDataFactory.getDataFromBase64(PlayerDataFactory.java:36)的.parseJson(GsonParser.java:36)位于java的org.jblux.client.states.MainMenuState.update(MainMenuState.java:155)。 util.Observable.notifyObservers(Observable.java:142)org.jblux.client.network.ResponseWaiter.responseReceived(ResponseWaiter.java:33)org.jblux.client.network.ServerListener.notify_observers(ServerCommun) icator.java:236)org.jblux.client.network.ServerListener.doCommand(ServerCommunicator.java:252)org.jblux.client.network.ServerListener.run(ServerCommunicator.java:218)

我在这里找到了另外两个相关的问题。
Google App Engine上的GSON会引发安全例外
在applet中使用GSON库时的reflection权限问题

但他们都没有得到我的答案。 一个刚刚说不使用Gson。
有没有办法将reflection权限授予我的applet?

更新:我正在切换我的应用程序以使用JNLP文件和Java Web Start,因为我无法弄清楚如何使Applet工作。 如果有人想出来的话,我会打开这个问题,但如果你不想放弃Gson,使用JNLP可能是唯一的选择。

我使用自定义反序列化器解决了这个问题。

我有一个有两个成员的class级,一个时间戳和一个双打列表。 这是适合我的代码。

 GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(TimestampedValueList.class, new JsonDeserializer() { @Override public TimestampedValueList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { long timestampMs = json.getAsJsonObject().get("timestampMs").getAsLong(); double[] valueList = context.deserialize(json.getAsJsonObject().get("valueList"), double[].class); return new TimestampedValueList(timestampMs, valueList); } }); gson = gsonBuilder.create(); 

希望这可以帮助任何人!

我在这里找到了答案。

 System.setSecurityManager(null); 

添加到静态主要帮助我。 当然,jnlp等中的所有权限必须是。

继@Chrizzz之后,我正在Java Web服务器和未签名的applet之间进行双向命令对象交换。 因此我在我的applet代码中使用Gson toJson()和fromJson()。

我发现无符号小程序中的反序列化和序列化都会引发安全exception,并且实现自定义序列化器和反序列化器可以解决这些问题。

最大的痛苦是无法模拟applet环境(SecurityManager)进行unit testing。 似乎没有可用的框架:请参阅例如如何unit testing预期在applet中运行的Java代码Security Manager