【问题标题】:GSON fromJson() hangs and silently crashes with graphics PathGSON fromJson() 挂起并与图形路径静默崩溃
【发布时间】:2017-08-13 13:09:45
【问题描述】:

我需要序列化 ​​Path 对象并面临奇怪的不可能。应用程序刚刚停止。

让我们在 onCreate() 中放置一个简单的测试

    import com.google.gson.Gson;
    import android.graphics.Path;

    ...

    Gson g=new Gson();
    Path p=new Path();
    p.addRect(0,0,100,100, Path.Direction.CCW);
    String s=g.toJson(p).toString(); 
    p = g.fromJson(s, Path.class); //(1)

运行应用程序并等待约 5-15 秒。首先它挂起,然后会默默地崩溃。如果您注释字符串 (1),它将起作用。如果将 (1) 的 Path.class 更改为 p.getClass()new TypeToken(){}.getType() em> - 这无济于事。所以原因在于fromJson

我用 SDK 17 到 25 尝试了 4 台设备,并且行为是相同的。怎么了,如何存储 JSON 的路径?

p.s. gradle 使用 com.google.code.gson:gson:2.+

编辑:我的假设是无限路径的循环,这让 GSON 感到困惑。

edit2:他们说,不可能序列化Path。我用并行列表围绕 Path 编写了自己的实现,效果很好

edit3:这里可能出现错误和 cmets 中询问的字符串

08-13 19:33:40.380 883-1405/? E/NativeCrashListener:异常处理 有报告 android.system.ErrnoException:读取失败:EAGAIN(再试一次) 在 libcore.io.Posix.readBytes(本机方法) 在 libcore.io.Posix.read(Posix.java:165) 在 libcore.io.BlockGuardOs.read(BlockGuardOs.java:230) 在 android.system.Os.read(Os.java:350) 在 com.android.server.am.NativeCrashListener.consumeNativeCrashData(NativeCrashListener.java:240) 在 com.android.server.am.NativeCrashListener.run(NativeCrashListener.java:138)

.

s={"isSimplePath":true,"mLastDirection":"CCW","mNativePath":-1221497024,"rects":{"mNativeRegion":-1222844744}}

【问题讨论】:

  • 异常中有什么?发布它,如果可能的话也发布s的值
  • @Yazan 查看已编辑的问题。我不确定例外,但只有一个。
  • 此异常中没有任何内容表明它是由您的应用程序引起的,它来自操作系统和平台,除非它是由您的应用程序引起的,那么这是我不知道的事情!!,JSON 看起来很简单,我不知道认为它会导致这样的循环或递归问题?!
  • @Yazan 是的。请参阅下面的答案。

标签: android gson


【解决方案1】:

恐怕您这里的代码是正确的,异常来自其他地方
这是我的小测试,没有发生崩溃
不如把这个分开试试

【讨论】:

  • 有趣。但是分开什么?
【解决方案2】:

好的,答案。官方原因是:1.不可能,2.是的,无限循环。

您永远不应该序列化您无法控制的对象 并且没有明确设计用于序列化。在这个 例如,Path 的内部是一个实现细节。这 序列化的正确方法是为 类型并使用它的公共 API 来决定你想要什么表示 在 JSON 中。

在 Gson 的精神继承者 Moshi 中,我们实际上禁止 默认情况下序列化 android.* 包中的任何内容,除非你 注册一个手动适配器来定义 JSON 格式。很遗憾 改变 Gson 做同样的事情为时已晚。

至于这里的实际原因,您对参考循环的猜测 Path 的实现细节是原因。

https://github.com/google/gson/issues/1140

【讨论】:

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