首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在两个不同的序列化中使用相同的POJO,同时自定义一些属性?

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

Stack Overflow用户
提问于 2014-06-23 22:23:30
回答 2查看 822关注 0票数 0

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

我用jackson来序列化DTO

代码语言:javascript
复制
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,但在其他情况下,我不需要它。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-06-23 23:37:27

您可以尝试使用视图

此上下文中的“视图”意味着能够定义逻辑属性子集(通过getter或字段访问的内容)来序列化。视图是静态定义的(使用注释),但是要用于序列化的视图是动态选择的(每次序列化)。

编辑

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

代码语言:javascript
复制
class Pojo1 extends BaseAuditDto {

    private String name;

    //getters, setters
}

代码语言:javascript
复制
class Pojo2 extends BaseAuditDto {

    private String description;

    //getters, setters

}

现在,我们必须使用BaseAuditDto类的getter创建接口。它可以是这样的:

代码语言:javascript
复制
interface BaseAuditDtoIgnorePropertiesMixIn {
    @JsonIgnore
    String getCreatedBy();
    @JsonIgnore
    Date getCreatedDate();
    @JsonIgnore
    String getUpdatedBy();
    @JsonIgnore
    Date getUpdatedDate();
}

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

代码语言:javascript
复制
ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(Pojo1.class, BaseAuditDtoIgnorePropertiesMixIn.class);

现在,我们可以测试我们的类:

代码语言:javascript
复制
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));

以上代码打印:

代码语言:javascript
复制
{"id":1,"name":"Name"}
{"id":2,"createdBy":"me","createdDate":1403653155395,"updatedBy":"you","updatedDate":1403653155395,"description":"Description"}

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

票数 1
EN

Stack Overflow用户

发布于 2014-06-23 23:13:51

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

当您将数据转换为JSON或XML时,情况就另当别论了--您可以提供/省略一些属性,因为格式足够冗长,以防止错误的分配。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24375555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档