【发布时间】:2014-09-17 12:16:00
【问题描述】:
我正在使用一个抽象类来管理一个数据库,它有很多方便的方法。特别是它有insert(Context)、update(Context)和delete(Context),这意味着你可以创建一堆不同的对象来继承这个类,它们都有自己的数据库映射,只需一个一个地更新或插入它们。
另一位开发人员已将 GSON 反序列化标记添加到此结构中。这工作正常,除了更新功能依赖于比较对象的唯一标识符;用作标识符的特定事物因对象而异。这意味着虽然包含update(...) 方法的超类具有
@SerializedName("id")
protected String mUUID;
子类需要不同的映射。
目前我正在通过覆盖子类中的update(...) 方法来解决这个问题,以使用不同的标识字段进行比较,但这非常不令人满意。是否可以将不同的序列化名称映射到 GSON 中的超类字段,如果可以,您是如何做到的?
为了澄清,类结构大致是
public abstract class DatabasePersistent {
//...
@SerializedName("id")
protected String mUUID;
//...
public int update(Context context) {
return context.getContentResolver().update(
getContentProviderURI(), //abstract, allows objects to update the right table
toContentValues(), //abstract, converts the object to a ContentValues
UUID_EQUALS, //this is a where clause string
new String[]{mUUID}
);
}
}
我想做一个
public class Thing extends DatabasePersistent {
//all the abstract implementations
//and so on
}
它以某种方式改变了 mUUID 的映射,因此我可以使用与超类中相同的主 ID 机制(例如更新方法),但传入 JSON 中的不同字段标识不同的对象。
【问题讨论】:
-
我不确定我是否真的得到了完整的问题(可能是具有不同 id 的更多代码以及它们与 gson 的关系?)但在我看来,您可以定义一个
getId超类中的方法,并覆盖子类中的方法以返回要用作标识符的字段。 -
这是一个非常好的主意,但遗憾的是它告诉我“属性值必须是恒定的”(我有点认为它可能,但即便如此,这是一个巧妙的想法)。
-
我的意思是你可以在更新方法中使用
new String[]{getId()}而不是new String[]{mUUID},并有一个默认实现public String getId() { return mUUID; }例如 -
哦,现在我明白了。是的,那会奏效。不过,我真的很想知道您是否可以更改这样的反序列化映射,因为在我看来,这将是一件非常有用的事情。
-
@alobodzk 在他们的回答下发表了一条有趣的评论,我将其粘贴在这里: > 如果 GSON 允许在方法上使用
@Expose会容易得多,那么您将注释 getId() 访问器。要绕过它,您可以使用这个坏男孩:github.com/julman99/gson-fire 或实现您的 JsonSerializer对象,它会为您调用该方法。
标签: java android json inheritance json-deserialization