3

protobuf-csharp-port ランタイムを使用していくつかのファイルを作成およびコンパイルしまし.protoた。WCF メソッド呼び出しへの応答として 1 つを返そうとしています。これが私のサービスです:

[ServiceContract]
public interface IService
{
    [OperationContract]
    IEnumerable<Protobuf.LogEntry> GetLogItems();
}

しかし、これは役に立たない「サーバーは意味のある応答を提供しませんでした」というエラーメッセージで失敗します。

別の質問への回答は、これがシリアライザーの爆撃であり、エラーメッセージを提供していない可能性があることを示唆しているため、コントラクトを次のように変更してみましたstring:

[OperationContract]
IEnumerable<string> GetLogItems();

これは正常に機能するため、Protobuf と関係があるに違いありません。

私の推測では、何らかの理由で WCF が Protobuf をシリアル化できないということです。多くの人が書いているのを見てきました[DataContract]が、これは にのみ関連しているようですが、まったく同じように使用されていないように見えるprotobuf-netに関する情報は見つかりませんでした。Protogenのオプションを に設定しようとしましたが、これは何も修正しません (関係ないかもしれません)。protobuf-csharp-port[DataContract]-code_contractstrue

では、WCF メソッド呼び出しから Protobuf オブジェクトを返すにはどうすればよいでしょうか? 明らかに、Protobufs を手動でデシリアライズすることもできますが、これは面倒なので、WCF にやってもらいたいと思っています。

WCF のシリアル化を Protobufに置き換えようとしているわけではないことに注意してください。WCF メソッド呼び出しから Protobuf オブジェクトを返したいだけです。

編集 #1:手動でセットアップしDataContractSerializer、Protobuf をシリアル化しようとしました。Type 'Protobuf.LogEntry' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMember attribute.コードが自動的に生成されているため、Clearly, I cannot do this.というエラーが表示されます。では、ProtoGen などを使用して、適切な属性を追加するにはどうすればよいでしょうか。

4

0 に答える 0