2012-11-07 16 views
12

[Serializable]とマークされたクラスがあります。私がWeb APIから返すとき、フィールド名はすべてファンキーです。 ASP.NET Web APIと[Serializable]クラス

は、通常、JSONが返さ私はそれをシリアライズキャッシュのためにBinaryFormatterを使用するようにマークするwan't

[{"<OrderId>k__BackingField":797 ... 

[シリアライズ]

を使用する場合

[{"OrderId":797 ... 

JSONが返されます。カスタムシリアライザを作成するか、シリアライザブルではないツインクラスを作成し、その間に "キャスト"するためのサルコードを書く以外の方法はありますか?

+0

バイナリフォーマッタはどのようにキャッシュを助けますか? – DarthVader

+0

注文は外部システムからのもので、APIを使用してすべての注文を日付ゼロから取得するのに10秒かかります。最後にキャッシュされた日付と現在の日付の間に注文を取得し、キャッシュに格納してから完全なリストを返す方がはるかに迅速です。 – Malako

+1

これはJSON.net [Web APIで使用されるデフォルトのJSON直列化ライブラリ]の制限です。これを参照してください - http://stackoverflow.com/questions/10143420/why-does-json-net-serialization-fail-with-serializable-and-a-lambda-inside-a-r最新バージョンのJSON.NETを試したり、キャッシュする方法を探したりすることができます。 – Suhas

答えて

21

あなただけJson.NETが再び[Serializableを]セマンティクスを無視するように取得するには、このワンライナーを必要とする:

((DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true; 

あなたのためのよりよい解決策が完全に[Serializableを]を取り除くためにあるかもしれない、使用を中止BinaryFormatterを使用し、別のシリアライザを使用して、Json.NETシリアライザのようなキャッシングを実行します。

+0

ありがとう! JsonFormatterでうまく動作しますが、もっと一般的な方法がありますか?私はクライアントがJson、JsonP、Xmlを要求しています。 – Malako

+1

いいえ、ありません。すべてのフォーマッタは、[Serializable]を独自の方法で処理する方法を自由に選択できます。デフォルトのXmlFormatterは[Serializable]を認識しますが、これを避けるにはXmlSerializerに切り替えることができます。より良い解決策は、[Serializable]を完全になくし、BinaryFormatterの使用をやめ、代わりにJson.NETシリアライザのようなキャッシングを行うために別のシリアライザを使用することです。 –

+1

私はJson.NETシリアライザを使いました。パフォーマンスはBinaryFormatterほど良く、[Serializable]属性は必要ありません。答えに入れて、あなたは信じるでしょう。ありがとう! – Malako