osmdroid Polygon类到String

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了osmdroid Polygon类到String相关的知识,希望对你有一定的参考价值。

我想在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)...

我该怎么办呢?

答案

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

The Polygon class是一个osmdroid特定和非平凡的抽象,包含形成形状和形状中的洞的点,关于其外观(绘画)和行为的信息。它包含一些其他非平凡类(例如LinearRing)的实例。该类不打算用作数据对象,并且(de)序列化为JSON或任何其他类似格式。一些包含的成员很难序列化,因为它们是特定于平台的(Paint)。

使用一个单独的类只包含你想要存储在JSON中的信息会更清晰(你只需要点数组吗?你需要包含任何样式信息吗?等等。)。这个类应该是你的代码库的一部分,因此可以通过Gson轻松序列化。根据您的使用情况,您可以从此类或相反的方式创建多边形。这种方法允许您只模拟所需的复杂性(例如,您是否需要带孔的多边形?)。

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

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

另一答案

OSMBonusPack lib从osmdroid覆盖(包括Polygon)到GeoJSON(Json)提供conversion tools

以上是关于osmdroid Polygon类到String的主要内容,如果未能解决你的问题,请参考以下文章

如何从共享类到ViewController获取JSON响应数据?

OSMDROID:使用 osmdroid 地图实时获取当前坐标

osmdroid 的用户代理

osmdroid - 更高的缩放级别?

Osmdroid 地图旋转

OSMdroid 边界标记