Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson-如何根据不同字段的值序列化/反序列化字段?_Java_Gson - Fatal编程技术网

Java Gson-如何根据不同字段的值序列化/反序列化字段?

Java Gson-如何根据不同字段的值序列化/反序列化字段?,java,gson,Java,Gson,我们有相当大的班级: class Foo { // ... many fields @Expose @JsonAdapter(DateAdapter.class) Date start; @Expose String startTimeZone; // ... more fields } 现在,在本地,start的值存储为UTC,时区信息单独存储在startTimeZone中。但是,在向服务器发送数据时,我们需要将start转换为sta

我们有相当大的班级:

class Foo {
    // ... many fields
    @Expose
    @JsonAdapter(DateAdapter.class)
    Date start;

    @Expose
    String startTimeZone;
    // ... more fields
}
现在,在本地,start的值存储为UTC,时区信息单独存储在startTimeZone中。但是,在向服务器发送数据时,我们需要将start转换为startTimeZone,并将其格式化为字符串“YYYY-mm-dd HH:mm:ss”

我们有一节约会后的课

public class DateAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        return DateUtils.parseServerDateTime(json.getAsString);
    }

    @Override
    public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(DateUtils.formatServerDateTime(src));
    }
}
公共类DateAdapter实现JsonSerializer、JsonDeserializer{ @凌驾 公共日期反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext) 抛出JsonParseException{ return DateUtils.parseServerDateTime(json.getAsString); } @凌驾 公共JsonElement序列化(日期src、类型typeOfSrc、JsonSerializationContext){ 返回新的JsonPrimitive(DateUtils.formatServerDateTime(src)); } } 但是,在DateAdapter中,我们无法访问startTimeZone字段,因此无法将其用于格式化/解析


我知道我们可以为整个类编写一个自定义适配器,但是如上所述,这个类相当大,所以我希望有一个不同的解决方案。

也许可以为整个类创建一个自定义适配器,调用
context.serialize()
在它内部序列化所有其他内容并以不同方式处理
startTimeZone
?@Pateman感谢您的提示,我不知道这是可能的。似乎是完美的解决方案。我将在星期一试一试。“如果你把你的评论作为一个答案发表,我很乐意接受它,如果它行得通的话。”帕特曼不幸的是,你的想法行不通。在serialize中调用context.serialize()会导致无限循环,最终导致堆栈溢出。它可能与人工父类一起工作,但我的类是RealmObject,它们不允许继承:-/所以不能创建一个字段是对要序列化的类的引用的类?类似于
class Foo{private instance;}
?@Pateman的东西你是说像一个包装器?这可能会起作用,但我必须更改所有代码,使其不使用类,而是使用包装器。。。与foo.getStart()类似,它必须是wrapper.getFoo().getStart()。。。