我知道这两个库的特性和设计,但我还没有发现这两个库之间有任何直接的性能比较。两个人都是很棒的说谎者。关于设计,我认为应该更快一点,因为反射较少,对吗?
此外:
?
谢谢。
发布于 2011-04-19 20:48:58
重新执行性能;protobuf-net旨在尽可能少地执行该反射,在此之后创建高效的数据访问代码。在v2中,它在许多方面更进一步--使用更低级别的元编程,如果您想要它(完全是可选的),那么在运行时,独立序列化程序dll的预生成成本介于最小(如果使用运行时元编程)到零(如果使用前生成)之间。
重新发布;“当它准备好了”;生活非常繁忙,但是完全的.NET和iPhone都可以使用alpha dll (后者可能会在大多数较轻的运行时起作用,因为iPhone是最受限制的)。最终,现实是(作为非赞助的,等等)它将落后于工作和家庭之类的事情--不过,我尽量找时间。
我认为更明智的比较是目标;protobuf的设计是为了很容易地安装到您现有的DTO或域模型上,而不需要进行大量的重新工作--或者在代码优先场景中使用。它也支持.proto的下一代,但这并不是主要的目标(但当然是非常可取的)。它还使用了一个非常不同的API,面向的是常见的.NET隐喻,而不是普通的原型隐喻。
或者换个说法:
中。
一个微妙的区别,也许--事实上,这两者都会为.NET提供一个有价值的序列化API。
因此,如果您的主要目标是在同一团队中积极工作的异构环境之间进行互操作,那么protobuf-csharp可能更适合您。
我也有点..。与protobuf“松散”,所以我没有(嗯,最小)愧疚,有点超出标准规范(同时保持在协议定义内)在继承,全图等鞋跟,这些是常见的.NET生态系统,但没有直接的地图在原型。当然,我可以更多地查看像WCF这样的工具(在较小的程度上:远程处理)。
发布于 2012-11-20 02:15:51
当我使用protobuf-csharp时,我在这个库中发现了一个bug。例如,当我创建如下消息时:
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#代码将发生以下错误:在解析协议消息时,输入在字段中间意外结束。这可能意味着输入已经被截断,或者嵌入的消息错误地报告了自己的长度。
当我使用小型calculateInfocnt.Result时,它又起作用了。
https://stackoverflow.com/questions/5722171
复制相似问题