为了确保在我的RESTful Web服务中来回发送的数据不是多余的,每个嵌套对象只将它的ID序列化(A Message的User创建者只有userId序列化,因为客户端和服务器都已经知道了所有的细节.用户).
序列化工作完美,产生:
{"messageCreatorUser":"60d01602-c04d-4a3f-bbf2-132eb0ebbfc6","messageBody":"Body", ...}
Run Code Online (Sandbox Code Playgroud)
问题:反序列化不会生成仅包含其ID的嵌套对象.生成的反序列化嵌套对象为null.
这是前面提到的Message和User对象.从此处指定的第3个选项中使用序列化"策略": 如何仅使用Jackson序列化孩子的ID.
Message.java
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "messageId")
public class Message implements Serializable {
// -- Hibernate definitions omitted --
private UUID messageId;
// -----------------------------------------------------------------
// Here is what makes the serializer print out the ID specified on the class definition
@JsonIdentityReference(alwaysAsId = true)
// Here is my attempt to get the User class back when I deserialize
@JsonDeserialize(as = User.class)
@JsonSerialize(as = User.class)
private User messageCreatorUser;
// ------------------------------------------------------------------
// -- more arbitrary properties --
public Message() {
}
public Message(UUID messageId) {
this.messageId = messageId;
}
public Message(String messageId) {
this.messageId = UUID.fromString(messageId);
}
// -- getters and setters --
Run Code Online (Sandbox Code Playgroud)
User.java
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userId")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User implements Serializable {
private UUID userId;
// -- other arbitrary properties --
public User() {
}
public User(UUID userId) {
this.userId = userId;
}
public User(String userId) {
this.userId = UUID.fromString(userId);
}
// -- getters and setters --
Run Code Online (Sandbox Code Playgroud)
预期的反序列化对象:
Message object =
String messageBody = "Body";
User messageCreatorUser =
UUID userId = 60d01602-c04d-4a3f-bbf2-132eb0ebbfc6;
Run Code Online (Sandbox Code Playgroud)
实际反序列化对象:
Message object =
String messageBody = "Body";
User messageCreatorUser = null;
Run Code Online (Sandbox Code Playgroud)
就像我说的那样,我希望User只用ID来创建一个嵌套对象60d01602-c04d-4a3f-bbf2-132eb0ebbfc6
使用:
为什么结果不同?
正如此处的答案(Jackson deserialize JsonIdentityReference (alwaysAsId = true))所述,使用 setter 反序列化器效果很好,并且不需要令人讨厌的自定义反序列化器:
消息.java
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "messageId")
public class Message implements Serializable {
private UUID messageId;
@JsonIdentityReference(alwaysAsId = true)
private User messageCreatorUser;
// -- other fields and such --
public User getMessageCreatorUser() {
return messageCreatorUser;
}
public void setMessageCreatorUser(User messageCreatorUser) {
this.messageCreatorUser = messageCreatorUser;
}
@JsonProperty("messageCreatorUser")
public void setMessageCreatorUser(String userId) {
this.messageCreatorUser = new User(userId);
}
Run Code Online (Sandbox Code Playgroud)
用户.java
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userId")
public class User implements Serializable {
private UUID userId;
// -- other fields --
public User(String userId) {
this.userId = UUID.fromString(userId);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,为了使用@JsonIdentityReference(alwaysAsId = true),您需要有@JsonIdentityInfo(...)某个地方。
| 归档时间: |
|
| 查看次数: |
4698 次 |
| 最近记录: |