假设您可以直接通过以下方式控制序列化过程ObjectMapper
,您可以通过创建一个轻松完成此任务对象编写器特定于您的超类。这是一些示例代码来说明这一点。
public class Account implements Serializable {
private String accountNumber;
private String routingNumber;
private BigDecimal balance;
// Constructors, setters/getters
}
public class SavingsAccount extends Account {
private BigDecimal savingsRate;
// Constructors, setters/getters
}
final ObjectMapper mapper = new ObjectMapper();
final ObjectWriter writer = mapper.writerWithType(Account.class);
final ByteArrayOutputStream baos = new ByteArrayOutputStream(6400);
final SavingsAccount account = new SavingsAccount("0031-3402-2189",
"0009835011203", BigDecimal.valueOf(53500),
BigDecimal.valueOf(0.3));
writer.writeValue(baos, account);
final String results = new String(baos.toByteArray());
baos.close();
System.out.println(results);
运行上面的代码说明 Jackson 写入了超类字段,即使运行时实例是子类类型。
{"accountNumber":"0031-3402-2189","routingNumber":"0009835011203","balance":53500}
EDIT:
谢谢,但就我而言,我尝试在几个方面实现这种行为
类是我序列化的外部类的字段。我可以定义吗
更一般的类型?
这种情况就更容易处理了。只需在外部类中注释适当的字段即可@JsonSerialize。如果将字段声明为超类类型,则设置typing
作为静态。这会将这些字段标记为 Jackson 使用编译时类型而不是运行时类型进行序列化。
另一方面,如果将字段声明为子类类型,则设置using
作为超类。
以下示例使用我在上面进一步定义的类:
public class BankCustomer implements Serializable {
@JsonSerialize(typing=Typing.STATIC)
private Account cdAccount;
@JsonSerialize(using=Account.class)
private SavingsAccount savingsAccount;
}