2013-03-02 18 views
17

でオブジェクトへのデシリアライズ。名前は、今のところ、SimpleProtocolParallelProtocolです。私はこれらのオブジェクトを永続化したいので、私はJSON.NETを使い、すべて正常に動作します。しかし、私はJSONデータをロードし、取得したいような状況で今の私JSON.NETは私が解決することができません、次の問題を抱えているTypeパラメータ

SimpleProtocol p = JsonConvert.DeserializeObject<SimpleProtocol>(myJsonData); 

:私はそれらをデシリアライズしようとしていたとき、私は、彼らは、例えば、ことになっているタイプを知っているとき、それは完璧に動作を除きますIProtocolが返ってきますが、これはJSONが許可していないことを意味します。そうで試して、ちょうど私が必要なもののように見える

public static Object DeserializeObject(
    string value, 
    Type type 
) 

:だから

IProtocol p1 = JsonConvert.DeserializeObject<IProtocol>(myJsonData); // does not work 
IProtocol p2 = (IProtocol)JsonConvert.DeserializeObject(myJsonData); // also, does not work 

、私はこのメソッドのシグネチャを見つけアップAPI探して:例えば、このような何かがない仕事はありませんまた、文字列タイプを永続化し、それを取得する:

// test 
Type protocolType = Type.GetType("MyApp.Protocols.SimpleProtocol"); 
IProtocol p1 = JsonConvert.DeserializeObject(myJsonData, protocolType); 

私はをキャストすることは不可能であるエラーが発生します210〜IProtocol。これは奇妙で、私はこれを解決する方法を知らない。

一般的な方法でTypeオブジェクトを渡すことは不可能なので、ここでは基本的に固執しています。これを解決する方法はありますか?好ましくはReflectionを使わないでください。これは完全に通常のユースケースであると私は思います。

私は何ができますか、私には少し汚れているようですが、IProtocolインスタンスを保持してシリアライズ/デシリアライズする簡単なラッパークラスを作成することですか?

+0

あなたは、単一の要素またはのコレクションをデシリアライズしていますそれら? – R0MANARMY

+2

これらの質問を見て、それらが役立つかどうかを見てみるといいでしょう:[JSON.NETでの逆シリアル化のためのキャスティングインターフェイス](http://stackoverflow.com/q/5780888/164966)、[カスタムJsonConverterの実装方法JSON.NETでベースクラスオブジェクトのリストを非直列化する](http://stackoverflow.com/q/8030538/164966)、[Json.NETコンバータを使用したプロパティの逆シリアル化](http://stackoverflow.com/q/ 2254872/164966)。 – R0MANARMY

+0

あなたのヒントをありがとう、私はそれらを読んだが、私の解決策は異なっていることが判明した(下記参照)。 – avanwieringen

答えて

22

このメソッドを使用して、私の最初のアプローチは、すべての後に正しかったようだ:

public static Object DeserializeObject(
    string value, 
    Type type 
) 

問題は、私は

Type protocolType = Type.GetType(PersistedTypeString);から次の値をもたらしたMyProtocol.GetType().FullNameを使用して、私のオブジェクト型を持続していることでした

は、nullの値を持つタイプになります。しかし、ここでは(PSこれはまた、(Type.GetTypeのドキュメントに含まれている))だけで正常に動作し

MyProtocol.GetType().AssemblyQualifiedNameすべてのものを使用して、私のコードサンプルです:

Type ProtocolType = Type.GetType(MetaData["ProtocolType"]); 
var Protocol = JsonConvert.DeserializeObject(Data["Protocol"], 
              ProtocolType, 
              JsonProtocolPersister.DefaultSettings); 
return (IProtocol)Protocol; 
関連する問題