关于thrift字段修改的问题

最近修改了一个模块的接收,数据传输类型由原来的struct改为了string,测试中接收端出现异常而退出(实际上并非由接收引起,而是由于反序列化未捕捉异常引起),特此总结一下。以下用到的struct只用来说明问题。

(1)接收端调用bool Send(const string& s),而发送端调用bool Send(const Student& s)

如果发送端不是Send,则会抛出异常:没有这个函数。

而当二者同为Send(函数名一样)时,不会异常,并且发送和接收均成功

而这时接收端并没有发觉,继续处理后面的事情。后面的代码大致是这样的:先将string push到一个并发队列中,然后由其他线程处理并发队列中的数据,处理的第1件事情就是对string进行反序列化。反序列化时未捕获异常,导致程序core dump退出。原因很简单:string数据为空。

解决这个问题,要么捕获异常,要么在接收端加上判断,当string大小为0时返回失败。

(2)当然将string发送给一个接收Student的接收端同样成功,接收到的数据同样为空。这时可以在struct中约定一个必填字段,如果该字段为空则返回false。

(3)如果将struct1发往struct2的接收端,则会出现数据解析错误:No more data to read.

等同字段修改,可以参考:关于thrift字段修改的问题


猜你喜欢

转载自blog.csdn.net/hbuxiaoshe/article/details/38932189