将Protobuf定义转换为Thrift

6
有没有工具可以从Protobuf定义生成Thrift接口定义?
4个回答

1

写了一个翻译器,可以将 Thrift 的子集转换为 Protobuf,反之亦然。

这是一些 Thrift 代码:

enum Operation{
    ADD=1,SUBTRACT=2,MULTIPLY=3,DIVIDE=4
}
struct Work{1:i32 num1,2:i32 num2,4:string comment
}

这将自动转换为以下 Protobuf 代码:

enum Operation{
    ADD=1,SUBTRACT=2,MULTIPLY=3,DIVIDE=4
}
message Work{int32 num1 = 1;int32 num2 = 2;string comment = 4;
}

1
看起来答案是“还没有”。一个问题是,Thrift定义了一个完整的RPC系统,包括服务和方法调用,而protobuf真正关注的是数据类型和序列化位。Thrift的数据模型比protobuf的略为受限(没有递归结构等),但在thrift->protobuf方向上不应该成为问题。
当然,你可以很容易地将所有的thrift数据类型转换为protobuf定义,完全忽略服务部分。如果你想的话,你甚至可以将这样的东西作为内置生成器添加到thrift编译器中。
但是,Thrift和Protobuf并不可互换。请看Thrift与Protocol Buffers最大的区别是什么?以了解一些关键的区别。你到底想要实现什么?

0

我认为没有这样的工具。如果你想编写代码,你可以编写一个语言生成器来为你生成.thrift文件。

你可以用任何语言编写这个工具(我在protobuf-j2me [1]中用C++编写了它,并在[2]中适应了protobuf-csharp-port代码)。

你可以让protoc.exe像这样调用它:

protoc.exe --plugin=protoc-gen-thrift.exe --thrift_out=. file.proto

你需要将命名为protoc-gen-thrift.exe 才能使用 --thrift_out选项。

[1] https://github.com/igorgatis/protobuf-j2me

[2] https://github.com/jskeet/protobuf-csharp-port/blob/6ac38bf84452f1f9bd3df59a276708725be2ed49/src/ProtoGen/ProtocGenCs.cs


0

我相信是有的。

请查看我编写的非破坏性转换器protobuf-thrift,它可以将protobuf转换为thrift,反之亦然。此外,它还将保留声明顺序和注释,从而最大程度地保留源代码格式。

您也可以在这里尝试Web界面。

顺便说一句,我也同意captncraig的答案。的确,thrift和protobuf有许多不同之处,例如protobuf中的嵌套类型和thrift中的联合类型。但是,你不能否认它们有很多共同的语法,例如enum => enum,struct => message,service => service,这些是我们最常用的语法。

因此,protobuf-thrift是帮助您减少重复工作的工具,同时知道“它们并不是100%可转换”的真相。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接