是否可以在两个不同的序列中使用相同的POJO,自定义一些属性?

时间:2014-06-23 22:23:30

标签: java json serialization jackson

我想使用相同的DTO,但在某些情况下我需要忽略一些属性,在其他情况下我想使用它,但我不想做一个重复的对象或自定义序列化,以某种方式存在要指定,如果在此实现中使用DTO,则忽略此属性,如果在其他实现中使用DTO,则不要忽略这些属性。

我使用 jackson 来序列化DTO

public abstract class BaseAuditDto extends BaseIdentifiableDto {



    private static final long serialVersionUID = -6010447982202996167L;

    @JsonIgnore

    private String createdBy;


    @JsonIgnore

    private Date createdDate;


    @JsonIgnore

    private String updatedBy;


    @JsonIgnore 

    private Date updatedDate;


    //getters and setters   

}

基本上我需要在某些情况下使用createdBy和createdDate,但在其他情况下我不需要它。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用Jackson views

  

此视图中的“视图”表示定义逻辑子集的能力   属性(通过getter或字段访问的东西)来序列化。查看   静态定义(使用注释),但查看用于   动态选择序列化(每个序列化)。

修改
我想我误解了你的问题。您可以使用视图,但这将非常棘手且难以理解。您可以使用MixIn feature,这将更容易实现。假设您有两个POJO类:

class Pojo1 extends BaseAuditDto {

    private String name;

    //getters, setters
}

class Pojo2 extends BaseAuditDto {

    private String description;

    //getters, setters

}

现在我们必须使用BaseAuditDto类的getter创建接口。它看起来像这样:

interface BaseAuditDtoIgnorePropertiesMixIn {
    @JsonIgnore
    String getCreatedBy();
    @JsonIgnore
    Date getCreatedDate();
    @JsonIgnore
    String getUpdatedBy();
    @JsonIgnore
    Date getUpdatedDate();
}

如您所见,上面的接口定义了BaseAuditDto类中存在的方法的注释。现在,我们必须告诉Jackson我们要忽略哪些类的属性。见下面的代码:

ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(Pojo1.class, BaseAuditDtoIgnorePropertiesMixIn.class);

现在,我们可以测试我们的课程:

Pojo1 pojo1 = new Pojo1();
pojo1.setCreatedBy("me");
pojo1.setCreatedDate(new Date());
pojo1.setUpdatedBy("you");
pojo1.setUpdatedDate(new Date());
pojo1.setId(1);
pojo1.setName("Name");

Pojo2 pojo2 = new Pojo2();
pojo2.setCreatedBy("me");
pojo2.setCreatedDate(new Date());
pojo2.setUpdatedBy("you");
pojo2.setUpdatedDate(new Date());
pojo2.setId(2);
pojo2.setDescription("Description");

System.out.println(mapper.writeValueAsString(pojo1));
System.out.println(mapper.writeValueAsString(pojo2));

以上代码打印:

{"id":1,"name":"Name"}
{"id":2,"createdBy":"me","createdDate":1403653155395,"updatedBy":"you","updatedDate":1403653155395,"description":"Description"}

如您所见,Jackson忽略BaseAuditDto类的Pojo1属性。

答案 1 :(得分:-1)

AFAIK如果您打算序列化/反序列化您必须提供的对象(使用标准功能),然后期望所有值,则serialVersionUID定义序列化数据的格式。

当您将数据转换为JSON或XML时,这是另一个故事 - 您可以提供/省略一些属性,因为格式足够冗长以防止错误的分配。