thrift-java序列化时的一些注意事项

12 篇文章 1 订阅

假设我们有类似这样一个消息体:

struct RecoRequest {
	1:map<string,string> params,
	2:string deviceId
}

一、对于普通基本类型:

1、如果deviceId属性设置成required,该字段必填,传输时必然会序列化;
 1)客户端不设置,或者设置成客户端request.setDeviceId(null);,会报错:

Caused by: org.apache.thrift.protocol.TProtocolException: Required field 'deviceId' is unset! Struct:RecoRequest(params:{uid=testuid, feedNum=13, req_id=testuid}, deviceId:null)
	at com.abc.ceshi.recothrift.model.RecoRequest.validate(RecoRequest.java:389)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.validate(IPersonalRecoService.java:509)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:566)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:1)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.write(IPersonalRecoService.java:486)
	at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:63)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.send_recommend(IPersonalRecoService.java:82)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.recommend(IPersonalRecoService.java:74)
	... 50 more

 2)客户端request.setDeviceId("123");,服务端recoRequest.isSetDeviceId();为true

2、如果deviceId属性设置为optional,表示可以不填充、或者填null,并且不填充也不会序列化。
1)客户端不设置,或者设置为null(request.setDeviceId(null);)服务端recoRequest.isSetDeviceId();为false
2)客户端request.setDeviceId("123");,服务端recoRequest.isSetDeviceId();为true

3、如果deviceId属性设置为默认(字段前无标识),表示可以不填充,但一定会序列化;
同optional

 

二、对于集合类型:

1、map、list等容器类型,且为required:

 1)客户端设置时,容器中如果某个元素为null,则会报错:

Caused by: java.lang.NullPointerException
	at org.apache.thrift.protocol.TBinaryProtocol.writeString(TBinaryProtocol.java:200)
	at com.abc.ceshi.recothrift.model.RecoRequest$RecoRequestStandardScheme.write(RecoRequest.java:477)
	at com.abc.ceshi.recothrift.model.RecoRequest$RecoRequestStandardScheme.write(RecoRequest.java:1)
	at com.abc.ceshi.recothrift.model.RecoRequest.write(RecoRequest.java:359)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:571)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:1)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.write(IPersonalRecoService.java:486)
	at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:63)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.send_recommend(IPersonalRecoService.java:82)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.recommend(IPersonalRecoService.java:74)
	... 50 more

 2)客户端不设置(不set)或者设置为null,客户端会报错:

Caused by: org.apache.thrift.protocol.TProtocolException: Required field 'params' is unset! Struct:RecoRequest(params:null, deviceId:123)
	at com.abc.ceshi.recothrift.model.RecoRequest.validate(RecoRequest.java:389)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.validate(IPersonalRecoService.java:509)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:566)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:1)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.write(IPersonalRecoService.java:486)
	at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:63)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.send_recommend(IPersonalRecoService.java:82)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.recommend(IPersonalRecoService.java:74)
	... 50 more

 3)客户端设置request.setParams(paramMap);,服务端recoRequest.isSetParams();为true

2、map、list等容器类型,设置为默认或者optional:

1)客户端设置时,容器中如果某个元素为null,则会报错:

Caused by: java.lang.NullPointerException
	at org.apache.thrift.protocol.TBinaryProtocol.writeString(TBinaryProtocol.java:200)
	at com.abc.ceshi.recothrift.model.RecoRequest$RecoRequestStandardScheme.write(RecoRequest.java:477)
	at com.abc.ceshi.recothrift.model.RecoRequest$RecoRequestStandardScheme.write(RecoRequest.java:1)
	at com.abc.ceshi.recothrift.model.RecoRequest.write(RecoRequest.java:359)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:571)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:1)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.write(IPersonalRecoService.java:486)
	at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:63)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.send_recommend(IPersonalRecoService.java:82)
	at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.recommend(IPersonalRecoService.java:74)
	... 50 more

2)客户端不设置(不set)或者设置为null,服务端recoRequest.isSetParams();为false
3)客户端设置request.setParams(paramMap);,服务端recoRequest.isSetParams();为true

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值