既存の WCF アプリケーションを更新して、protobuf-net サポートを追加しました。基本的に、私は:
すべてのデータ オブジェクトを含むアセンブリの参照として protobuf-net.dll (.net 3.0) を追加しました。このアセンブリは、サーバーとクライアントの両方から参照されています
[DataMember] を [DataMember(Order = x)] に置き換え (x として増加する int を使用)
すべての OperationContracts を ProtoBehavior 属性で更新しました
サービス参照を更新しました
クライアントから、サーバーでこのメソッドを呼び出します。
[OperationContract(IsOneWay = false), ProtoBehavior]
ConnectionData Join(string userId, string Password);
ConnectionData は次のように定義されています。
[DataContract]
public class ConnectionData
{
[DataMember(Order = 1)]
public ConnectionStatusEnum ConnectionStatus; // this is a normal enum with five elements
// .....
[DataMember(Order = 5)]
public bool MustChangePassword;
}
さて、ここで何が起こっているのですか:
サーバーをデバッグすると、ConnectionData オブジェクトが正しく初期化され、Join メソッドで返されることがわかります
クライアントをデバッグすると、Join 呼び出しから null オブジェクトが返されます。
WCF トレースを最大詳細まで有効にしました。サーバーのログには何も表示されませんでしたが、クライアントのログ ファイルには次の警告メッセージが表示されました。
System.Runtime.Serialization.ElementIgnored
逆シリアル化中に認識されない要素が XML で検出されましたが、無視されました。
要素 http://tempuri.org/:proto
ネットワークトラフィックを盗聴しましたが、これを逆シリアル化できないことをprotobuf-netのせいにしません:
<s:Body><JoinResponse xmlns="http://tempuri.org/"><proto/></JoinResponse></s:Body>
問題をさらにトラブルシューティングし、protobuf-net でメッセージを正しくシリアル化するにはどうすればよいですか?
私はprotobuf-net r275を使用しています