2011-08-05 8 views
5

私たちはたくさんのクラスを持つ巨大なアプリケーションを持っています。私たちは現在、この.netアプリケーションをMonotouchでIPadに移植しています。 DataContractSerializerにいくつかの問題があり、Marc Gravellのprotobuf-netシリアライザを使用したいと考えています。WCF DatacontractSerializerからProtobuf-netに正しく移行する方法は?

クライアントとサーバー間の通信は、WCFサービスによって管理されます。

WCFサービスは、クライアントとサーバーに公開されている1つのインターフェイスと、サーバー上のこのインターフェイスの1つの実装で構成されています。

インターフェースは以下のようになります。

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    SomeObject MyFunction(SomeObject myObject); 
} 

サーバー側の実装は以下のようになります。

[ServiceBehavior(...)] 
public class MyService 
{ 
    public SomeObject MyFunction(SomeObject myObject) 
    { 
    } 
} 

私たちのクラスは以下のようになります。

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    public int SomeProp {get; set;} 

    [OnSerialized] 
    public void OnSerialized(StreamingContext context) 
    { 
    } 
} 

だからここに私の質問です:

  • 私のクラス、wcfインターフェイス、およびwcfの実装に加えられる変更は何でしょうか。

  • どのように私は、デフォルトのWCF DataContractSerializerをProtobufシリアライザに置き換えますか?

MonoTouchでに、私はProtobufProtobuf.Meta名前空間へのアクセス権を持っていることに注意してください。

[EDIT] Iは、シリアライザランタイムを交換する方法を発見した: Custom WCF DataContractSerializer

上記溶液はDataContractSerializerOperationBehaviorを使用します。 Protobuf-netはそのような振る舞いをしていますか?

+0

第2にMarcは言った:あなたがMonoでそれを行うことができるMS .NET上のシリアライザを交換することができますので、MonoTouchに従うことを仮定しないでください。 MonoのWCFスタックは未熟で、MTはその部分集合だけを実装しています。 – TheNextman

答えて

2

すべての正直なところ、私はmonototouchで利用可能なWCFオプションに慣れていません。通常の.NETとSilveightでは非常に異なっていますが、モノタッチには実行時にシリアライザをスワップする機能があるとは思われません。これは、DataContractSerializerから制御を争うことができないので、のサイレントへの移行を難しくします。

このように、最も簡単な選択肢は、データの制御を手動で奪取して、 - 理想的にはモノトックで可能なMTOMエンコーディングを送信することです。それでは、あなたが一度あなたのbyte[]を持っていれば、彼らの言うとおり、世界はあなたの軟体動物です。

あなたのタイプが変更されました...まあ、MyFunction()はデータが転送されないという点で奇妙なので、私があなたに提案したいものがわかりません。 MyClassの場合、必要なのはメンバーごとに一意の番号(グローバルではなくタイプ内で一意)です。

[DataContract] 
public class MyClass 
{ 
    [DataMember(Order=1)] // <==== this provides the 1 as the key 
    public int SomeProp {get; set;} 

    // see below re callback 
} 

シリアル化コールバックもあります。これらは完全にサポートされていますが、わかりやすいパターンを見つけることを期待しています。StreamContextは私が知っているものではありません(StreamingContextとその他いくつかのもので動作するはずです)。

最後に、デフォルトではであることに注意してください。protobuf-netはコンストラクタを実行します。これはDataContractSerializerとは異なります。もしあなたが望めば、これを避けることができます:

[DataContract(SkipConstructor=true)] 
public class MyClass {...} 

私がここでの意図を忘れてしまった場合は、私に教えてください。

また、必要に応じて属性を変更/追加せずにすべての設定を行う方法もあります。

+0

あなたの答えはありがとうございます。私のインターフェース(MyFunction)に示したいことは、ServiceContract属性とOperationContractを持っていることです。私が知りたいことは、これらの属性は同じですか?私は、私の例を入力するときに間違いを犯しました。それはStreamContextではなくStreamingContextです。私は自分の投稿を編集します。 –

+0

そして、どのように属性を変更せずに設定を行うのですか? –

+0

@Jean - 後者の質問。 "v2"にはすべてを設定できるRuntimeTypeModelがあります。最初のものを再 - コアシリアライザ(MSフル.NETで行うことができます)を置き換えることなくそこで私はAPIのコアオブジェクトとして 'byte []'を使うことを提案しました。完全な.NETほど便利ではない、私は同意する。もちろん、その時点でWCFがあなたのために追加しているものが不思議に思うかもしれません....多分生のソケットやHTTP POSTは簡単です。 –

関連する問題