NOT: Sadece orijinal soruda belirtilen bilinen tür sorununu çözmek istiyorsanız, cevabımın başında JavaScriptSerializer hakkında çok fazla ayrıntıya girdim, sonuna kadar atla cevabın
Performans koştum benchmarks dayanarak
, JavaScriptSerializer diğer alternatiflere göre çok daha yavaştır ve seri hale getirmek sürece 2x atabileceğiniz/DataContractSerializer kıyasla bir nesnedeki seriyi kaldırmak.
, JavaScriptSerializer o vaktinden 'bilinen türde' belirtmek için gerektirmez ve JSON en az temiz olmasını daha esnek olduğunu söyledi Bilinen Tip
gerek yok sözlükler durumu (bkz. örnekler here).
Bilinen tipler etrafında bu esnekliğin çevirme tarafı, aynı JSON dizesini orijinal türüne geri gönderemeyecektir.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Ve Dictinoary<string, object>
bir örneğini oluşturmak ve bunu seri hale önce kendisine Person
sınıfının bir örneğini eklerseniz:
var dictionary = new Dictionary<string, object>();
dictionary.Add("me", new Person { Name = "Yan", Age = 30 });
var serializer = new new JavaScriptSerializer();
var json = serializer .Serialize(dictionary);
Ben olacak Mesela ben basit Person
sınıf var varsayalım Çok temiz, ancak herhangi bir tür bilgiden yoksun olan aşağıdaki JSON {"me":{"Name":"Yan","Age":30}}
olsun.
public class Employee : Person
{
}
sonra basitçe serileştirici JSON {"Name":"Yan","Age":30}
seriden çıkarılabilir garanti edebilmek için hiçbir yolu yoktur: Aynı üye tanımlarla iki sınıf varsa veya Person
herhangi bir ek üyelerini tanıtan olmadan sınıflandırma ise Yani sözde doğru tipte. Eğer JavaScriptSerializer kullanarak {"me":{"Name":"Yan","Age":30}}
serisini ise
, sözlükte siz "me" Person
örneğidir ancak bunun yerine bir Dictionary<string, object>
, basit bir mülkiyet torba değil ilişkilendirilmiş değeri geri almak. Eğer geri Person
örneğini almak istiyorsanız
yaptığında (büyük olasılıkla asla istemem ama!) olabilir Dictionary<string, object>
ConvertToType
yardımcı yöntemi kullanarak bu dönüştürmek: eğer Öte yandan
var clone = serializer.Deserialize<Dictionary<string, object>>(json);
var personClone = serializer.ConverToType<Person>(clone["me"]);
JSON'un doğru tipte serileştirilmesi konusunda endişelenmenize gerek yok ve JSON serailizasyonu bir performans darboğazı değil (kodunuzu izleyin ve daha önce yapmadıysanız, ne kadar zaman harcayacağınızı serileştirmek için ne kadar zaman harcadığınızı öğrenin) sadece JavaScriptSerializer kullanın.
günün sonunda, hala DataContractSerializer kullanmak ve bu KnownTypes enjekte gerekir gerekiyor, EĞER burada deneyebileceğiniz iki şey vardır Bilinen Tip enjekte ediliyor.
1) Bilinen tür dizisini DataContractSerializer constructor'a aktarın.
2) DataContractSerializer için sizi ilgilendiren türleri) bulmak için araçlarla DataContractResolver bir alt sınıfı (geçirin constructor
Sen türlerinden izler türlü bir 'bilinen tip kayıt' oluşturabilir
o sözlüğe eklenebilir ve size DataContractSerializer için enjekte etmek gerekir tüm türlerini kontrol ederseniz, en basit şeyi deneyebilirsiniz:
bir türü ekleme statik yöntemlerle bir KnownTypeRegister
sınıf oluşturun bilinen türler listesine:
var serializer = new DataContractSerializer(typeof(Dictionary<string, object>), KnownTypeRegister.Get());
: Eğer seri hale oluşturmak zaman
[DataContract]
public class Person
{
static Person()
{
KnownTypeRegister.Add(typeof(Person));
}
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
}
kasadan bilinen türlerinden dizisini alın:
public static class KnownTypeRegister
{
private static readonly ConcurrentBag _knownTypes = new ConcurrentBag();
public static void Add(Type type)
{
_knownTypes.Add(type);
}
public static IEnumerable Get()
{
return _knownTypes.ToArray();
}
}
sicil ile türleri kaydeden statik kurucu ekleyin
Daha fazla dinamik/daha iyi seçenek olabilir Ayrıca, dinamik olarak bilinen tip çözünürlük hakkında daha fazla bilgi edinmek isterseniz, uygulamak daha da zordur, Juhson Lowy'nin here konusundaki MSDN makalesine bir göz atın. Ayrıca, Carlos Figueira tarafından this blog post da konuyla ilgili bir okumaya değer, türleri dinamik olarak oluşturma gibi daha ileri teknikler hakkında ayrıntılı bilgi!
Bundan çok memnun olduğum için memnunum. Lütfen, WCF'nin bu vb. Için nasıl yapılmadığı ile ilgili argümanlara cevap vermekten çekinmeyin. Bilinen bir yol varsa ya da orada olmanız ve geçerli nedenlerden (eğer ne olursa olsun) bize bildirin. nedenleri?). – tishma