我有一个服务器-客户端应用程序,我可以在其中修改两个代码库。客户端通过众多的Web服务与服务器通信,我通过Web引用系统分享了一些在服务器端定义的类。在网络上,数据是使用 XML (SOAP) 发送的。另外,我使用XmlSerializer
.
由于不断上升的性能问题,我想迁移到更复杂的序列化程序,并着眼于 Protocol Buffers 和 protobuf-net。我目前使用 protobuf-net v2 (r480, .NET 3.5)
我似乎遇到的问题是通过 Web 参考系统共享的类不保留自定义类/成员属性,如ProtoContract
和ProtoMember
.
(但是序列化器系统并没有像往常一样抛出System.InvalidOperationException: Type is not expected, and no contract can be inferred
,给我留下了一个空流。是不是因为在客户端生成的类被标记为partial
?)
示例,服务器端:
[ProtoContract]
public class CommentStruct
{
[ProtoMember(1)] public int id;
[ProtoMember(2)] public DateTime time;
[ProtoMember(3)] public string comment;
[ProtoMember(4)] public int session;
}
客户端(生成的代码):
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.1432")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org")]
public partial class CommentStruct {
private int idField;
private System.DateTime timeField;
private string commentField;
private int sessionField;
/// <remarks/>
public int id {
get {
return this.idField;
}
set {
this.idField = value;
}
}
[...]
我设法ProtoPartialMember
在客户端使用一个额外的类文件来解决这个问题:
[ProtoContract,
ProtoPartialMember(1, "id"),
ProtoPartialMember(2, "time"),
ProtoPartialMember(3, "comment"),
ProtoPartialMember(4, "session")]
public partial class CommentStruct
{
}
这里的主要问题是:我可以用不同的方式来避免代码重复吗?
另一个是:我会错过一些 protobuf-net 的好东西,比如继承支持吗?
我找到了一些关于 protobuf-net Visual Studio 插件的信息。但正如 Marc Gravell 将其描述为“事后的想法”,我不愿意使用它。此外,我的一些合作开发人员正在使用不支持加载项的 VS Express 版本。
编辑:我的主要重复问题是必须两次指定类成员和protobuf-net属性-在服务器端的类定义和客户端的部分类属性中。