2012-05-07 5 views
2

逆シリアル化したいオブジェクトがありますが、これは外部ライブラリ(Serializableとしてマークされています)で構造体として宣言されています。シリアル化は正常ですが、デシリアライズは機能しません。私はすでに構造体をクラスに変更しようとしましたが、それは役に立ちませんでした。 JsonSerializerSettingsなどの何かを特別なものにする必要がありますか、それともサポートされていませんか? TypeNameHandlingやTypeNameAssemblyFormatのように、すでにいくつかのパラメータを試してみましたが、うまくいきませんでした。外部ライブラリで宣言された構造体でオブジェクトを逆シリアル化します

いくつかのコードは、尋ねたとおり、これは外部のライブラリ内で宣言されています

として、独自のプロジェクトにデシリアライズ
Stream stream = System.IO.File.Open(fileName, FileMode.Create); 
string json = JsonConvert.SerializeObject(entry, Formatting.None, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects }); 
StreamWriter streamWriter = new StreamWriter(stream); 
streamWriter.Write(json); 
streamWriter.Flush(); 
stream.Close(); 

StreamReader streamReader = new StreamReader(input); 
string json = streamReader.ReadToEnd(); 
object returnObject = JsonConvert.DeserializeObject<T>(json); 
input.Close(); 
return returnObject; 

など独自のプロジェクトで連載

[Serializable] 
public struct BarEntry 
{ 
    public RegistryValueKind One; 
    public string Two; 
    public string Three; 
    public string Four; 
    public object Five; 
} 

[Serializable] 
public struct FooEntry 
{ 
    public string One; 
    public string Two; 
} 

自分のプロジェクトの中のすべてがこのコードでうまく動作しますが、外部ライブラリからはそれを捨てることはできません(BarEntryとFooEntryの両方から)オブジェクトをializeします。

またBarEntryとFooEntryは両方彼らのストレージ・オブジェクトに同じプロパティに格納されています。

public object Entry { get; set; } 
+0

いくつかのコードを、してください! –

+0

追加されました、編集された開始ポストを確認してください;) –

+0

そして、あなたが「うまくいかない」と言うと、実際に何が起こるのですか? –

答えて

0

あなたはJsonConvert.DeserializeObjectに正確な型を送信する必要があり、そうでない場合は必要に応じています右のオブジェクトを作成する方法はありませんjson stringからdeserializeするプロパティ。したがって、このタイプを外部アセンブリからロードし、Json.NETに送信します。このような何か:

Assembly assembly = Assembly.LoadFile("ExternalAssembly.dll"); 
Type barEntryType = assembly.GetType("BarEntry"); 
var returnObject = JsonConvert.DeserializeObject(json, barEntryType); 

または外部アセンブリを参照すると、単純には、次の操作を行います。

BarEntry returnObject = JsonConvert.DeserializeObject<BarEntry>(json) 
+0

あなたの返事をありがとう、私はすでにこれを試みたが、これは動作しません(startpostを参照して、私はこれを正確に行った)。 –

+1

あなたはオブジェクトを持っていますreturnObject = JsonConvert.DeserializeObject (json); Tが定義されている方法は明確ではありません –

+0

'T'は 'BarEntry'と同じジェネリック型です。 –

関連する問題