1
class Attribute1 
{ 
} 

class Attribute2 : Attribute1 
{ 
} 
class class1 
{ 
    Attribute1 attr1; 
} 

class class2 : class1 
{ 
    Attribute2 attr2; 
} 


var serializerSettings = new JsonSerializerSettings(){TypeNameHandling = TypeNameHandling.Objects}; 
class2 a = SomeValidObjectoftype Class2; 
string serializedClass2 = JsonConvert.SerializeObject(a, serializerSettings); 
var am = JsonConvert.DeserializeObject<Class2>(serializedClass1); 

上記はすべてJSONのプロパティとオブジェクトです。私がしようとしているのは、シリアライズとデシリアライズで、型を失うことではありません。 デシリアライズ中に私はam.attr2のタイプを失います。現在はAttribute1となっています。私はAttribute2としたい。それは可能ですか?もしそうなら、誰かが私にそれを行う正しい方法を教えることができます。私はSerializationSettingsを含め、それでも同じ問題にぶつかりました。あなたがTypeNameHandling = TypeNameHandling.Objects(またはAllまたはAuto)を渡す必要があり派生型のJSON逆シリアル化

答えて

0

デシリアライズだけでなく、シリアライズするとき:

var am = JsonConvert.DeserializeObject<Class2>(serializedClass1, serializerSettings); 

を、私は、これはセキュリティ上の理由であると信じて:それはデフォルトを使用すると、予期しないタイプが直列化復元中に注入することができないことを意味設定。 docsから:アプリケーション は、外部ソースからJSONをデシリアライズするとき

TypeNameHandlingは注意して使用する必要があります。受信タイプは の値をTypeNameHandling.None以外で逆シリアル化するときにSerializationBinderというカスタムで検証された である必要があります。

この注意の必要性については、TypeNameHandling caution in Newtonsoft Jsonを参照してください。

サンプルfiddle

関連する問題