我需要序列化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}}
答案 0 :(得分:1)
答案 1 :(得分:0)
好的,答案。官方原因是:1。这是不可能的,2。是的,它是无限循环。
您永远不应序列化您无法控制的对象 并没有明确设计用于序列化。在这 例如,Path的内部是一个实现细节。该 序列化这个的正确方法是注册一个TypeAdapter 类型并使用其公共API来决定您想要的表示形式 在JSON。
在Gson的精神继承者Moshi,我们实际上是禁止的 除非你,否则默认情况下序列化android。*包中的任何内容 注册手动适配器以定义JSON格式。不幸 改变Gson做同样的事情已经太晚了。
至于这里的实际原因,你猜测了一个参考周期 Path的实现细节是原因。