现在我有一个应用程序,我的iPhone应用程序发送一个请求,该请求在.NET / C#中处理,序列化为XML,并在objective-c中在应用程序上解析。当前响应类结构对于每种类型的请求都有一个基类(BaseResponse)和许多(超过25个)子类,这些子类对应于需要返回的不同事物。现在我正在寻找protobuf是否比XML更快更容易。据我所知,这个类结构的.proto文件是:
Message BaseResponse {
Required Int field1 = 1;
Optional SubResponse1 sub1= 2;
Optional SubResponse2 sub2 = 3;
Etc....
}
Message SubResponse1 {
....
}
Message SubResponse2 {
....
}
Etc for each sub response.
我的问题是:如果我有超过25个这些可选元素(其中只有1个将为非null),那么这是否会完全消除使用protobuf的大小和性能优势? protobuf对这个应用程序有意义吗?
答案 0 :(得分:1)
不,它不会影响性能优势 - 您只需要在Objective-C代码中检查哪一个非空。由于protobuf仅序列化非空值,因此它仍然非常有效。 protobuf规范本身实际上并不包含继承,所以你说你需要通过封装来欺骗它是正确的 - 但是既然你提到了C#,请注意你所描述的内容(包括数据在网络上的显示方式,即它如果你使用protobuf-net作为C#实现,那么可以通过继承直接完成100%可比性 - 这应该可以用你现有的模型实现。例如:
[ProtoContract]
[ProtoInclude(2, typeof(SubResponse1))]
[ProtoInclude(3, typeof(SubResponse2))]
public class BaseResponse
{
// note Name and IsRequired here are optional - only
// included to match your example
[ProtoMember(1, IsRequired = true, Name="field1")]
public int Field1 { get; set; }
/*...*/
}
[ProtoContract]
public class SubResponse1 : BaseResponse
{/*...*/}
[ProtoContract]
public class SubResponse2 : BaseResponse
{/*...*/}
您可以通过以下方式获取.proto:
var proto = Serializer.GetProto<BaseResponse>();
给出了:
message BaseResponse {
required int32 field1 = 1 [default = 0];
// the following represent sub-types; at most 1 should have a value
optional SubResponse1 SubResponse1 = 2;
optional SubResponse2 SubResponse2 = 3;
}
message SubResponse1 {
}
message SubResponse2 {
}