【问题标题】:osmdroid Polygon class to Stringosmdroid 多边形类到字符串
【发布时间】:2018-08-30 00:54:16
【问题描述】:

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

我该如何解决?

【问题讨论】:

    标签: android json gson osmdroid


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      OSMBonusPack 库提供从 osmdroid 覆盖(包括多边形)到 GeoJSON(即 Json)的 conversion tools。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多