Java使用PubNub收发Transaction对象时反序列化失败如何处理?
PubNub 反序列化 Transaction 类失败的解决方案
PubNub Java SDK 默认使用 Jackson 完成序列化/反序列化,官方所说的自动序列化生效需要自定义类满足 Jackson 的序列化规则,不符合规则就会出现反序列化失败,最终收到的实际是 LinkedHashMap 类型而非预期的 Transaction 对象,可按以下步骤排查解决:
- 为
Transaction类添加无参公共构造方法
Jackson 反序列化时必须调用类的无参构造创建实例,如果你自定义了有参构造,Java 不会自动生成无参构造,需要手动补充,同时嵌套的Input类也必须添加无参公共构造方法,满足同样的序列化要求:
public class Transaction{ // 补充无参构造 public Transaction() {} public Map<String,Double> OutputMap; public Input input; public String id; //..其余属性 }
- 确保属性可访问或添加对应 getter/setter
如果你的类属性不是 public 修饰,需要为每个属性添加对应的 get、set 方法,或者给属性添加@JsonProperty注解,允许 Jackson 直接读写属性值:
public class Transaction{ public Transaction() {} @JsonProperty private Map<String,Double> OutputMap; @JsonProperty private Input input; @JsonProperty private String id; // 也可以选择写 getter、setter 代替注解 }
- 显式完成类型转换
如果收到消息后直接强转报错,可以将收到的消息对象用 Jackson 的 ObjectMapper 显式转换为 Transaction 类型:
// 接收到消息后执行转换 ObjectMapper objectMapper = new ObjectMapper(); Transaction transaction = objectMapper.convertValue(receivedMessage, Transaction.class);
- 自定义序列化逻辑(可选)
如果以上方法都不满足你的需求,可以在初始化 PubNub 实例时自定义序列化器,比如替换为 Gson 实现自己的序列化、反序列化逻辑,完全掌控类型转换过程。
内容的提问来源于stack exchange,提问作者ksgr5566
相关产品推荐
相关产品推荐

