我知道两个库的功能和设计,但我没有找到这两者之间的任何直接性能比较。两者都绝对是很好的库。关于设计,我认为protobuf-csharp-port由于反射较少而应该稍快一些,对吗?
此外:
谢谢。
答案 0 :(得分:7)
重新表现; protobuf-net旨在尽可能少地执行该反射,之后创建高效的数据访问代码。在v2中,它在很多方面进一步发展 - 使用很多低层元编程,如果你想要它(完全是可选的),预生成独立的序列化器DLL - 所以在运行时,反射成本介于最小(如果使用运行时元编程)到nil之间(如果使用预生成)。
重新释放; “准备好了”;生活是疯狂的忙碌,但完整的.NET和iPhone都可以使用alpha dll(后者可能适用于大多数较轻的运行时,因为iPhone是最严格的)。最终,现实是(作为非赞助等)它将落后于工作和家庭等一些事情 - 尽管如此,我试图找时间。
我认为更明智的比较是目标; protobuf-net旨在轻松安装到您现有的DTO或域模型上,无需进行大量返工 - 或用于代码优先方案。它也支持从.proto生成,但这不是主要目标(但当然非常需要)。它还运行一个非常不同的API,围绕常见的.NET隐喻,而不是常见的protobuf隐喻。
或换句话说:
一种微妙的区别,也许 - 实际上要么为.NET制作一个有价值的序列化API。
作为必然结果,如果你的主要目标是在同一个团队中积极工作的异构环境之间互操作 - 那么protobuf-csharp-port可能更适合你。
我也有点......松散地使用protobuf,所以我没有(好的,最小的)内疚感超出标准规范(同时保持在协议定义内),以继承鞋拔,完整-graphs等 - 这在.NET生态系统中很常见,但在protobuf中没有直接映射。当然,我可以更多地看待像WCF这样的工具(在较小程度上:远程处理)。
答案 1 :(得分:2)
当我使用protobuf-csharp-port时,我在这个lib中发现了一个错误。 例如,当我创建这样的消息时:
message CalculateInfo{
required string CalStarttime=1;
optional string CalEndtime=2;
required string Smiles=3;
optional string CAS=4;
optional string ChName=5;
optional string EnName=6;
required string Param=7;
required bytes Result=8;
required bool IsFinished=9;
}
message GetAllCalulateResponse{
required bool isSuccessful = 1;
required int32 Count=2;
repeated CalculateInfo History=3;
}
像这样的代码(在python中):
msg_resp.Count = len(resultSets)
calculateInfo = [None] * msg_resp.Count
cnt = 0
for result in resultSets:
calculateInfo[cnt] = msg_resp.History.add()
calculateInfo[cnt].CalStarttime = str(result.calculateStartTime)
calculateInfo[cnt].CalEndtime = result.calculateEndTime.strftime('%Y-%m-%d %X')
calculateInfo[cnt].IsFinished = result.isFinished
calculateInfo[cnt].Param = result.paramInfo
calculateInfo[cnt].Result = str('ff'*1000) #result.result
calculateInfo[cnt].Smiles = result.smilesInfo.smilesInfo
calculateInfo[cnt].CAS = result.smilesInfo.casInfo
nameSets = CompoundName.objects.filter(simlesInfo=result.smilesInfo.pk,isDefault=True)
for nameSet in nameSets:
if nameSet.languageID.languageStr == Chinese_Name_Label:
calculateInfo[cnt].ChName = nameSet.nameStr
elif nameSet.languageID.languageStr == English_Name_Label:
calculateInfo[cnt].EnName = nameSet.nameStr
cnt = cnt +1
C#代码将出现此错误: 在解析协议消息时,输入意外地在字段中间结束。这可能意味着输入被截断,或者嵌入的消息误报了自己的长度。
当我的小计算信息[cnt]。结果,它再次起作用。