Gson:bean中的枚举序列化问题

时间:2017-04-28 07:40:02

标签: java serialization enums gson

我的SegmentCreateRequest bean类:

public class SegmentCreateRequest {

    @SerializedName("name")
    private String segmentName;

    private SegmentSource segmentSource;

    public String getSegmentName() {
        return segmentName;
    }

    public void setSegmentName(String segmentName) {
        this.segmentName = segmentName;
    }

    public SegmentSource getSegmentSource() {
        return segmentSource;
    }

    public void setSegmentSource(SegmentSource segmentSource) {
        this.segmentSource = segmentSource;
    }

    public enum SegmentSource {

        @SerializedName("followed") FOLLOWED,
        @SerializedName("impressed") IMPRESSED,
        @SerializedName("engaged") ENGAGED,
        @SerializedName("tailored") TAILORED;

        @SerializedName("user_ids")
        private List<String> userIds;

        SegmentSource(){
            this.userIds = Lists.newArrayList();
        }

        public void setUserIds(List<String> userIds) {
            this.userIds = userIds;
        }

        public List<String> getUserIds() {
            return this.userIds;
        }

        public SegmentSource userIds(List<String> userIds) {
            this.userIds = userIds;
            return this;
        }
    }
}

segmentSource字段名称应根据枚举值更改。

我期待这个类的对象序列化返回类似:

{
 "name":"segment101",
 "followed":{"user_ids":["1234567890"]}
}

然而,它返回:

{"name":"skumar-3020-seg","segmentSource":"followed"}

使用Google Gson进行序列化/反序列化。

如何设置我的bean以实现所需的序列化?

1 个答案:

答案 0 :(得分:2)

您正在将枚举实例序列化为名为 segmentSource 字段

该字段的名称是不是名称!

除此之外,你的代码中还有一个潜在的错误:枚举就是singeltons!例如,将有一个的FOLLOWED实例。这意味着:对“FOLLOWED”列表的任何更改都是“全局”可见的。没有两个不同的SegmentCreateRequests(并行)。

换句话说:当你创建一些

SegmentCreateRequests reqA = ... 

某些特定用户在FOLLOWED上;但是你做了

SegmentCreateRequests reqB = ... 

并行,那么这两个请求对象最终将在相同的列表中工作。含义:您的代码不是线程安全的。因此:用户列表必须不进入枚举常量。它应该是周围请求的属性!