0

私はWCFとMemoryCacheをいじっています。目標は、Windows サービスで WCF をホストして、さまざまなクライアントがこのキャッシュにアクセスできるようにすることです。

最初の部分であるホストのセットアップは正常に機能し、別のクライアント アプリケーションを介してキャッシュへの書き込みとキャッシュからの読み取りを行うことができます。少なくとも、文字列や int などの値型など、非常に単純なオブジェクトをキャッシュに入れようとする場合。

「カスタム」オブジェクトを試してみると、文字列プロパティしかない場合でも、問題が発生し始めます。

There was an error while trying to serialize parameter http://tempuri.org/:value. 

TheInnerException message was 'Type 'Solution.MyType' with data contract name 
'MyType:http://schemas.datacontract.org/2004/07/MyType' is not expected. 
Consider using a DataContractResolver or add any types not known statically to the list    
of known types 
- for example, by using the KnownTypeAttribute attribute or by 
adding them to the list of known types passed to DataContractSerializer.'.
Please see   InnerException for more details.

検索を行った結果、タイプを KnownType 属性で装飾する必要があるかもしれないことがわかりましたが、残念ながら成功しませんでした。また、DataContract および DataMember 属性で装飾しようとしましたが、シガーもありませんでした。

今何をする?WCF DataContractResolver は私のためにこの作業を行うことになっていませんか? シリアライズしたいすべてのクラスに対してカスタム DataContractResolver を作成する必要があるとは信じがたいです。DataContract および DataMember 属性は他に何のためにあるのでしょうか?

ここで何が欠けていますか?また、MyType は別のクラス (保存オブジェクト) から継承しないことに注意してください。

4

3 に答える 3

0

WCF の最もおもしろい部分の 1 つは KnownType であることに対処する必要があると思いますシリアル化する必要がある各「子」型のKnownTypeAttribute (シリアル化可能とマークされている場合でも)。

于 2012-07-10T13:52:37.873 に答える
0

Serizlizable マーカーで MyType をマークしてみましたか? サービスを適切に作成する方法については、MSDN ライブラリの「サービス コントラクトの設計」を参照してください。また、サービスと実装クラスからコードの一部を投稿してください。

于 2012-07-10T13:46:59.897 に答える
0

カスタムのシリアル化を実装することでこれを解決しました。

string result = string.Empty;
        Encoding encoding = Encoding.UTF8;
        DataContractSerializer ser = new DataContractSerializer(typeof(MyType));
        MemoryStream stream = new MemoryStream();
        using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, encoding, true))
        {
            ser.WriteObject(writer, principal);
            writer.Flush();
            result = encoding.GetString(stream.ToArray());
        }

私の目的には十分です。

于 2012-07-10T14:21:46.983 に答える