GSON fromJson()挂起并静默崩溃图形Path

时间:2017-08-13 13:09:46

标签: android gson

我需要序列化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< Path>(){}。getType() - 它没有用。所以原因在于 fromJson

我尝试了4个带有17到25的SDK的设备,行为是一样的。有什么问题,如何将Path存储到JSON?

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

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

edit2:他们说,不可能序列化Path。我使用并行列表在Path周围编写了自己的实现,并且工作正常

edit3:此处可能出现错误,并在评论中询问字符串

  

08-13 19:33:40.380 883-1405 /? E / NativeCrashListener:异常处理   与报告                                                        android.system.ErrnoException:读取失败:EAGAIN(再试一次)                                                            at libcore.io.Posix.readBytes(Native Method)                                                            在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”:真 “mLastDirection”: “CCW”, “mNativePath”: - 1221497024 “rects”:{ “mNativeRegion”: - 1222844744}}

2 个答案:

答案 0 :(得分:1)

我担心你的代码是正确的,异常来自其他地方 这是我的小测试,没有发生崩溃 你为什么不把它分开试试呢

MyDemo

答案 1 :(得分:0)

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

  

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

     

在Gson的精神继承者Moshi,我们实际上是禁止的   除非你,否则默认情况下序列化android。*包中的任何内容   注册手动适配器以定义JSON格式。不幸   改变Gson做同样的事情已经太晚了。

     

至于这里的实际原因,你猜测了一个参考周期   Path的实现细节是原因。

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