解析两个protobuf之一

问题描述

我有一些C ++代码,有望收到两个protobuf之一。 (这是为了适应历史,而不是故意设计的。)

如果fcx.tcx.mk_fn_sig(...)函数无法解析字符串(我想我还没有找到有关此文档的权威文档),则返回false,所以我尝试这样做:

ParseFromString

不幸的是,两种类型的protobuf通常都能够解析两种类型的protobuf的序列化字符串。换句话说,

const string epistula_stream;   // Provided.

EpistulaOld e1;
Epistula e2;
if (e1.ParseFromString(epistula_stream)) {
    // I've got an old-style Epistula,do something.
    DoSomething(e1);
} else if (e2.ParseFromString(epistula_stream)) {
    // I've got a new-style Epistula,do something.
    DoSomething(e2);
} else {
    LOG_ERROR << "That didn't work as expected.";
}

打印

LOG_INFO << "Old: " << e1.ParseFromString(epistula_stream);
LOG_INFO << "New: " << e2.ParseFromString(epistula_stream);

关于如何处理此问题的任何建议?

一种选择是,我在两个单独的端口上初始化两个单独的侦听器,因此客户端负责发送到正确的端口。但是,这并不理想,因为目标是给客户端代码一些时间来升级而不是强制执行。

更新1

最后,由于我可以对两个protobuf进行明显的反序列化,并且由于这是不打算在生产环境中运行超过几周的转换代码,因此我只对两者进行反序列化,然后做一些实际工作检查。例如,它们将时间戳存储在不同的位置,这些时间戳代表的是现在附近的时间或多或少吗?

计算出的成功概率很高,但是几乎没有铁皮的感觉。

更新2

protobuf的实际定义是:

Old: true
New: true

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)