我正在开发一个使用Gson作为JSON反序列化器的应用程序,需要从REST API反序列化多态JSON.在解释mi问题之前,我已经一直在寻找Gson的多态反序列化,并在几个案例中成功实现了它.所以这是我遇到的一个具体问题.在问这个问题之前,我已经阅读了这篇精彩文章和Stack Overflow讨论.我正在使用RuntimeTypeAdapterFactory顺序反序列化多态对象.
我遇到的问题是,显然GSON RuntimeTypeAdapterFactory不允许声明指定层次结构内部对象类型的字段.我将用一些代码进一步解释.我有以下pojos结构(pojos为了简单起见已被减少):
public abstract class BaseUser {
@Expose
protected EnumMobileUserType userType;
}
public class User extends BaseUser {
@Expose
private String name;
@Expose
private String email;
}
public class RegularUser extends User {
@Expose
private String address;
}
public class SpecialUser extends User {
@Expose
private String promoCode;
}
Run Code Online (Sandbox Code Playgroud)
现在这是我RuntimeTypeAdapterFactory为用户层次结构定义的代码.
public static RuntimeTypeAdapterFactory<BaseUser> getUserTypeAdapter() {
return RuntimeTypeAdapterFactory
.of(BaseUser.class, "userType")
.registerSubtype(User.class, EnumMobileUserType.USER.toString())
.registerSubtype(RegularUser.class, EnumMobileUserType.REGULAR.toString())
.registerSubtype(SpecialUser.class, …Run Code Online (Sandbox Code Playgroud) 我正在创建一个应用程序,该应用程序将根据您的移动网络提供商所在的国家/地区显示该国家/地区的所有替代移动网络提供商的列表。为此,我正在使用telephonyManager.getSimCountryIso()检索国家/地区代码。
官方的android开发人员文档说:“返回与SIM卡提供商的国家/地区代码等效的ISO国家/地区代码”,因此从此我希望国家/地区代码始终始终与设备位置无关。但这不是它实际的工作方式! 例如,我最近遇到这种情况:我有一个带有西班牙SIM卡的android设备,属于西班牙网络提供商。因此,如果我在西班牙,TelephonyManager.getSimCountryIso()将返回“ es”。一切正常。问题例如,当我去法国旅行时,我调试了应用程序,发现telephonyManager.getSimCountryIso()返回的国家代码为:“ nl”(来自荷兰! 。与西班牙使用的设备和SIM卡相同,因此国家/地区代码ISO仍应为“ es”。
我的问题是这种方法实际上如何工作?如果我使用西班牙SIM卡,为什么会收到国家代码“ nl”(荷兰)?
预先感谢您的任何帮助