osmdroid 多边形 class 到字符串

osmdroid Polygon class to String

我想在 osmdroid 库中用 Gson 和多边形 class 创建一个 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.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)...

我该如何解决?

错误表明,在 Polygon 的层次结构中包含一些 class 没有默认构造函数(没有参数的构造函数)。 Gson 需要这样的构造函数。

The Polygon class is an osmdroid specific and nontrivial abstraction encapsulating points forming the shape and holes in the shape, information about its look (paint), and behavior.It contains instances of some other nontrivial classes (e.g. LinearRing)。 class 不打算用作数据对象和(反)序列化 to/from JSON 或任何其他类似格式。一些包含的成员很难序列化,因为它们具有很强的平台特定性 (Paint)。

cleaner 使用单独的 class 只包含您要存储在 JSON 中的信息(您只需要数组点数?您需要包含任何样式信息吗?等等)。这个 class 应该是你的代码库的一部分,因此很容易通过 Gson 序列化。根据您的用例,您可以从这个 class 或其他方式创建多边形。这种方法允许您只对所需的复杂性进行建模(例如,您需要带孔的多边形吗?)。

如果您真的想使用此 "shortcut" 并直接序列化 Polygon,您可以创建 a custom type adapter for Polygon 并将其注册到您的 Gson 实例。适配器的正确实现将非常复杂并且超出此响应的范围。但是,对于简单的情况,您应该能够轻松编写满足您需求的适配器。

几点提示:遵循class的源代码。 #getPoints()) 将为您提供多边形轮廓的点数组,#getHoles() 将为您提供孔数组。

OSMBonusPack lib 提供 conversion tools 从 osmdroid 叠加层(包括多边形)到 GeoJSON(Json)。