我想在osmdroid库中使用Gson和Polygon类制作一个Json字符串 但我得到安全例外 这是我的代码:
Polygon polygon = new Polygon();
Gson gson = new Gsom();
Type type = new TypeToken<Polygon>(){}.getType();
String jsonString = gson.toJson(polygon, type);
但我收到此错误消息:
java.lang.SecurityException: Can't make method constructor accessible
at java.lang.reflect.Constructor.setAccessible(Constructor.java:336)
at com.google.gson.internal.reflect.PreJava9ReflectionAccessor.makeAccessible(PreJava9ReflectionAccessor.java:31)
at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:103)
at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:85)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
at com.google.gson.Gson.getAdapter(Gson.java:458)
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:458)
at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48)
at com.google.gson.Gson.getAdapter(Gson.java:458)
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)...
我该如何解决?
答案 0 :(得分:1)
该错误表明,Polygon的层次结构中包含一些没有默认构造函数的类(没有参数的构造函数)。 Gson需要此类构造函数。
The Polygon class是特定于osmdroid的非平凡抽象,它封装形成形状和形状中的孔的孔,有关其外观(绘画)和行为的信息。它包含其他一些非平凡类的实例(例如{{3 }})。该类不能用作数据对象,也不能与JSON或其他任何类似格式反序列化。其中包含的某些成员很难序列化,因为它们是平台特定的(绘画)。
使用单独的类仅包含要存储在JSON中的信息(将只需要点数组吗?是否需要包含任何样式信息?等),这将更清洁。 )。该类应该是您的代码库的一部分,因此可以通过Gson轻松序列化。根据您的用例,您可以从此类或其他方法创建多边形。这种方法可让您仅建模所需的复杂度(例如,是否需要带孔的多边形?)。
如果您真的想使用此“快捷方式”并直接序列化Polygon,则可以创建LinearRing并将其注册到您的Gson实例。适配器的正确实现将非常复杂,并且超出了此响应的范围。但是,对于简单的情况,您应该能够轻松编写满足您需求的适配器。
一些技巧:遵循类的源代码。 #getPoints())将为您提供多边形轮廓的点数组,#getHoles()将为您提供孔的数组。
答案 1 :(得分:1)
OSMBonusPack库提供了conversion tools,从osmdroid叠加层(包括Polygon)到GeoJSON(即Json)。