両方のコードベースを変更できるサーバー クライアント アプリケーションがあります。クライアントは多数の Web サービスを介してサーバーと通信します。私は Web 参照システムを介してサーバー側で定義されたいくつかのクラスを共有します。ネットワーク上では、データは XML (SOAP) を使用して送信されます。また、 を使用してディスク上のデータの一部を保存しXmlSerializer
ます。
パフォーマンスの問題が増えているため、プロトコル バッファと protobuf-net に目を向けて、より洗練されたシリアライザーに移行したいと考えています。現在、protobuf-net v2 (r480、.NET 3.5) を使用しています。
ProtoContract
私が抱えていると思われる問題は、Web 参照システムを介して共有されるクラスが、 や などのカスタム クラス/メンバー属性を保持しないことです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
{
}
ここでの主な懸念は、コードの重複を避けるために別の方法でこれを行うことができるかということです。
もう 1 つは、継承サポートなどの protobuf-net 機能を利用できないでしょうか?
protobuf-net Visual Studio アドインに関する情報を見つけました。しかし、Marc Gravell がそれを「後付け」と表現しているように、私はそれを使用することに消極的です。さらに、私の共同開発者の何人かは、アドインをサポートしていない VS Express エディションを使用しています。
編集:私の主な重複の懸念は、サーバー側のクラス定義とクライアント側の部分クラス属性で、クラスメンバーとprotobuf-net属性を2回指定する必要があることです。