Ich habe eine Klasse mit der folgenden Strukturzuordnen/Deserialize generisches Objekt mit mehr abgeleiteten Typ in die einem mit weniger abgeleiteten Typ
public class GenericEntity<T>
where T : BaseClass
{
T Property {get; set;}
}
Ich habe mehr konkreten Implementierungen von BaseClass
und bin diese konkreten Implementierungen unter Verwendung von Objekt zu instanziiert vom Typ GenericEntity
z var entity = new GenericEntity<DerivedClass>()
Ich dränge diese Entität in ein Messaging-Framework durch Serialisierung des Objekts in JSON (mit Newtonsoft). Am anderen Ende extrahiere ich diese Nachricht (JSON) aus der Nachrichtenwarteschlange und versuche, die Nachricht in den Typ GenericEntity<BaseClass>
mit JsonSerializerSettings TypeNameHandling.All
zu deserialisieren. Aber zum Zeitpunkt der Deserialisierung, wirft es JsonSerializationException
mit Details
Typ angegeben in JSON ‚NewtonsoftPlayground.GenericEntity
1[[NewtonsoftPlayground.DerivedClass, NewtonsoftPlayground, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], NewtonsoftPlayground, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not compatible with 'NewtonsoftPlayground.GenericEntity
1 [[NewtonsoftPlayground.BaseClass, NewtonsoftPlayground, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null] ], NewtonsoftPlayground, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null '.
Wie kann ich das erreichen? Oder sollte ich nicht generisch verwenden? Wenn das der Fall ist, würde ich überall nach dem Extrahieren von Nachrichten aus der Warteschlange Typumwandlungen schreiben, was ich zu vermeiden versuche.
Hallo @Tamas Ionut, wenn Sie 'TypeNameHandling.All' Einstellungen während der Serialisierung verwenden, erhalten Sie den Fehler. In dem Code, den Sie ausprobiert haben, wird das Objekt zur Basisklasse deserialisiert, aber abgeleitete Klasseneigenschaftswerte werden nicht berücksichtigt. Was ich versuche zu erreichen, ist, dass deserialisierte Instanz vom Typ 'Derived1' sein sollte, aber die Schnittstelle sollte vom Typ' BaseClass' sein. Ich hoffe, dass dies weiter geht. Vielen Dank. –
Ich stimme dir zu. Ich bin nur spezialisiert Klasse.Ich bin Serialisierung Instanz des Typs 'GenericEntity', aber zum Zeitpunkt der Deserialisierung möchte ich es 'GenericEntity ' halten Instanz des Typs 'GenericEntity '. –
Ich versuche dies zu erreichen: 'Derived1 d1 = new Derived1 {Age = 23}; GenericEntity entity = new GenericEntity {Eigenschaft = d1}; var data = JsonConvert.SerializeObject (Entität, neue JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }); var baseEntity = JsonConvert.DeserializeObject > (Daten, neue JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }); ' –