Soru JSON.NET, Type parametresiyle nesnelleştirilecek şekilde seri hale getirildi


Çözemediğim şu sorunu yaşıyorum:

Her birinin adında bir arayüz uygulayan farklı sınıflarım var IProtocol. Şimdilik SimpleProtocol, ParallelProtocol. Bu nesneyi sürdürmek istedim, böylece JSON.NET kullandım ve her şey iyi çalışıyor. Bunları serileştirmeye çalıştığım durumlar dışında, örneğin olması gereken türü bildiğim zaman mükemmel çalışır.

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

Ancak, şimdi JSON verilerini yüklemek ve bir IProtocol geri, ama anlaşılır, JSON tarafından izin verilmez; E., böyle bir şey yapar değil iş:

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

Yani, yukarıya bakıyorum API Bu yöntem imzasını buldum:

public static Object DeserializeObject(
    string value,
    Type type
)

Ben ihtiyacım olan şey gibi görünüyor, bu yüzden de bir dizede türü devam ederek ve onu almayı denemek:

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

Bir hata yapmak imkansız bir hata alıyorum Newtonsoft.Json.Linq.JObject için IProtocol. Bu garip ve bunu nasıl çözeceğimi bilmiyorum.

Tip nesnesini genel bir yöntemle aktarmak imkansızdır, bu yüzden burada temelde sıkışmış durumdayım. Bunu tercihen Reflection kullanmadan çözmek için bir yöntem var mı? Bana göre bu tamamen normal bir kullanım durumudur.

Ne yapabilirim, ama benim için biraz 'kirli' gibi görünüyor, bir IProtocol örneğini tutan ve serileştirip / serpiştirmek için basit bir sarıcı sınıf oluşturmak mı?


18
2018-03-02 19:14


Menşei


Tek bir elementi mi yoksa onların bir koleksiyonunu mı serileştiriyorsunuz? - R0MANARMY
Bu sorulara bir göz atıp, yardım edip edemeyeceğini görmek isteyebilirsiniz: JSON.NET'te seri hale getirme için döküm arayüzleri, Temel sınıf nesnelerinin bir listesini serileştirmek için JSON.NET'te özel JsonConverter nasıl uygulanır, Özelliklerin serileştirilmesi için Json.NET dönüştürücülerinin kullanılması. - R0MANARMY
Önerileriniz için teşekkürler, bunları okudum, ancak çözümümün farklı olduğunu kanıtladı (aşağıya bakın). - avanwieringen


Cevaplar:


Bu yöntemi kullanarak ilk yaklaşımımın doğru olduğu anlaşılıyordu:

public static Object DeserializeObject(
    string value,
    Type type
)

Sorun, nesne türümü kullanmaya devam ettiğimdi. MyProtocol.GetType().FullName Bundan sonra gelen bir değerle sonuçlandı

Type protocolType = Type.GetType(PersistedTypeString);

bir tür olmak null değerler. Ancak kullanarak MyProtocol.GetType().AssemblyQualifiedName her şey gayet iyi çalışıyor (p.s. bu ayrıca Type.GetType () belgelerine dahil edilmiştir)

İşte kod örneğim:

Type ProtocolType = Type.GetType(MetaData["ProtocolType"]);
var Protocol = JsonConvert.DeserializeObject(Data["Protocol"], 
                                             ProtocolType, 
                                             JsonProtocolPersister.DefaultSettings);
return (IProtocol)Protocol;

25
2018-03-04 08:39