在我的项目中,我们有一个API,许多客户端可能会向这个API发送事务。应该签署交易。客户端可以用任何语言(C++,C#,python,go,任何)编写,具有任何CPU架构和字节序。针对不同的语言是否有稳定的序列化方法?
现在的问题是将我们的事务模型序列化为字节,以便能够签名并发送它。
我们的团队为此选择了protobuf v3.3.0(proto syntax = proto3)。
我们想用信封图案,看起来像:
message SignedTransaction {
message Transaction {/* any data that should be signed */}
Transaction transaction = 1;
Signature signature = 2;
}
签,我们只序列化对象内部交易:
Transaction tx = <...>;
std::string bytes = tx.SerializeAsString();
// and then sign bytes
与protobuf的现在的问题是,它似乎对于不同的语言来说是不确定的。今天,我们编写了简单的原始文件,其中包含几个整数和字符串,并填充了相同的数据,将其序列化为不同的语言并观察结果。
我们尝试的JavaScript,C++,Java中,斯威夫特和事实证明,除了C++都产生相同的输出字符串:
的JavaScript,Java中,斯威夫特生产:08B90A10BA0A1A106C6F6C206B656B20636865627572656B
C++制作:8FFFFFFB9A10FFFFFFBAA1A106C6F6C206B656B20636865627572656B
C++ parseFromString(str)
能够从其他语言反序列化字符串,但反之亦然。
的问题是:
- 为什么C++的protobuf产生不同的字符串?
- 我们可以为我们的用例使用哪些库?
详情:
// test.proto:
syntax = "proto3";
package api;
message Msg {
uint32 a = 1;
int32 b = 2;
string c = 3;
bytes d = 4;
}
// test.cpp:
api::Msg msg;
msg.set_a(1337);
msg.set_b(1338);
msg.set_c("lol kek cheburek");
std::string str = msg.SerializeAsString();
// str = 8FFFFFFB9A10FFFFFFBAA1A106C6F6C206B656B20636865627572656B
我认为一种很好的通用序列化方法是JSON。但当然,它不是一种二进制格式,它是一种文本格式。 –
向图书馆或其他非现场资源提出建议是SO的主题。 – tambre
有什么不对。以更长的代码方式显示您使用的。 Protobuf和这个类中的一些协议,在语言之间工作得很好(我认为问题对于像Marcin所说的C语言没有任何意义) –