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

Java 是否可以在两种不同的序列化中使用相同的POJO,自定义某些属性?,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我想使用相同的DTO,但在某些情况下我需要忽略某些属性,在其他情况下我想使用它,但我不想重复对象或自定义序列化,存在某种方式来指定,如果在该实现上使用DTO,则忽略此属性,如果DTO在其他实现中使用,请不要忽略这些属性 我正在使用jackson来序列化DTO public abstract class BaseAuditDto extends BaseIdentifiableDto { private static final long serialVersionUID = -60

我想使用相同的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,但在其他情况下我不需要它


谢谢。

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

当您将数据转换为JSON或XML时,情况就不同了-您可以提供/省略一些属性,因为格式足够详细,可以防止错误的赋值。

您可以尝试:

在这种情况下,视图意味着能够定义逻辑视图的子集 属性通过getter或要序列化的字段访问的对象。意见 使用注释静态定义,但要用于 每次序列化都会动态选择序列化

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

现在我们必须创建一个从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忽略了Pojo1类的BaseAuditDto属性。

我使用的是Jackson 2.4,JsonViews对我不起作用,您能提供一些示例吗?我理解JsonViews,现在我的问题是,是否可以将两个或更多的@JsonViews设置为同一个属性?我的示例显示的是MixIn功能而不是JsonView。回答你的问题:我不确定,可能不确定。
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"}