我正在使用gson进行改造,将我的json反序列化为领域对象.这在大多数情况下都非常有效.处理时遇到麻烦
RealmList(String(或任何其他基本数据类型))
由于Realm不支持RealmList,其中E不扩展Realm对象,我将String包装在RealmObject中.
public class RealmString extends RealmObject {
private String val;
public String getValue() {
return val;
}
public void setValue(String value) {
this.val = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我的领域对象如下
public class RealmPerson extends RealmObject {
@PrimaryKey
private String userId;
...
private RealmList<RealmString> stringStuff;
private RealmList<SimpleRealmObj> otherStuff;
<setters and getters>
}
Run Code Online (Sandbox Code Playgroud)
SimpleRealmObj工作正常,因为它只有String元素
public class SimpleRealmObj extends RealmObject {
private String foo;
private String bar;
...
}
Run Code Online (Sandbox Code Playgroud)
如何反序列化stringStuff?我尝试使用gson TypeAdapter
public class RealmPersonAdapter extends TypeAdapter<RealmPerson> {
@Override
public void write(JsonWriter out, RealmPerson …Run Code Online (Sandbox Code Playgroud) gson是一个很棒的图书馆 - 它运作良好.有时我有自定义要求,可以制作和注册TypeAdapters和TypeAdaptorFactories - 这也很有效.
然而令我困惑的是,如何委托回json序列化...大多数时候我需要这个用于集合,但为了说明这一点 - 假设我有一个对类,gson显然会愉快地序列化,但由于某种原因我需要自己的自定义序列化程序.好吧......如果我的配对是
public class Pair
{
public final Object First;
public final Object Second;
public Pair( Object first, Object second) {this.first = first; this.second = second};
}
Run Code Online (Sandbox Code Playgroud)
如果我为此编写了一个类型适配器 - 您希望 write函数看起来像:
public void write( JsonWriter out, Pair pair )
{
out.beginObject();
out.name( "first");
out.value( pair.first ); // can't do this
out.name( "second");
out.value( pair.second); // or this
out.endObject();
}
Run Code Online (Sandbox Code Playgroud)
所以你可以看到问题 - 我不知道第一个和第二个的类型,也不知道它们是如何序列化的.我可以使用gson.toJson来序列化第一个和第二个 - 但是如果我将它们作为字符串添加到编写器中,它们将被转义.有一个gson.tojson函数,它接受一个值和一个编写器 - 但它也需要一个typetoken - 我没有.我得到的印象是,我打算从某个地方安装另一个类型的适配器 - 但是当我只有一个对象列表时......我从哪里得到它?我只是获得对象的适配器?
我有点困惑?当然这是最常见的用例?大多数自定义序列化程序将用于T或T树之类的奇怪列表,并且你真的不知道列表中的内容,除了它继承自T …