我有一个服务器客户端应用程序,在其中我可以修改两个代码库。客户端通过大量的web服务与服务器进行通信,我通过Web引用系统共享服务器端定义的一些类。在连线上,使用XML (SOAP)发送数据。另外,我使用XmlSerializer
将一些数据保存在磁盘上。
由于性能问题不断增加,我想迁移到一个更复杂的序列化程序,我关注的是协议缓冲区和protobuf-net。我目前使用protobuf-net v2 (r480,.NET 3.5)。
我似乎遇到的问题是,通过共享的类不保留自定义类/成员属性,比如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
{
}
这里的主要关注点是:我能以不同的方式来避免代码重复吗?
另一个是:我会错过一些原型网络的好处,比如继承支持吗?
我发现了一些关于外接程序的信息。但由于Marc将其列为“事后思考”,我不愿使用它。此外,我的一些合作开发人员正在使用不支持外接程序的VS Express版本。
编辑:我的主要关注点是必须在服务器端的类定义和客户端的部分类属性中两次指定类成员和protobuf属性。
发布于 2012-07-11 10:15:32
作为一个次要的术语点,我将在这里避免使用“共享”一词,因为“共享”通常意味着:作为一个库(它可以工作)。
它不抛出错误的原因与partial
无关;很简单,protobuf对使用其他库的属性比较满意.在合理的范围内。例如,它将与[XmlType]
/ [XmlElement(Order=n)]
和[DataContract]
/ [DataMember(Order=n)]
一起工作。但是,这里从WSDL生成的代码不包括Order=n,因此它不认为这些代码是需要序列化的成员(它确实需要编号)。
[ProtoPartialMember(...)]
的使用(正如您提到的)是绕过这一问题的一种方法。它不限制您从其他原型网络的使用。[ProtoInclude(...)]
仍然可以工作(因为您提到了继承)。事实上,protobuf中的everything也可以完全在运行时配置,没有任何属性(通过RuntimeTypeMode
)。复制:除了类名之外,我看不到任何复制的东西。可以说,[ProtoInclude(...)]
与[XmlInclude(...)]
有点重复,但并不多见。
我很高兴相信我顺便使用了这个短语,但我不确定“事后思考”是否真的是我描述外接式用法的主要方式。澄清一下:protobuf主要是为了适应.NET中常见的代码优先(可能带有属性)的成语,而不是从工具中生成的。It 仍然可以使用。
当然,在可用的情况下,也许最简单的选择就是简单地共享.dll或.cs。这在WCF / DataContractSerializer
中很容易实现,但我不确定较老的"web参考“网站服务是否非常喜欢这一点。当然,也没有插件支持使用protobuf-net作为旧风格的"web引用“("asmx")的一部分,所以您可能已经需要在那里更改一些东西.
https://stackoverflow.com/questions/11430181
复制相似问题