Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Bu makale DataContractJsonSerializer konusundadır. JSON seri hale getirme ve seri durumdan çıkarma içeren çoğu senaryo için System.Text.Json ad alanında API'leri öneririz.
JSON (JavaScript Nesne Gösterimi), tarayıcının içindeki Web sayfalarında çalışan JavaScript kodu tarafından kullanılmak üzere özel olarak tasarlanmış bir veri biçimidir. Windows Communication Foundation'da (WCF) oluşturulan ASP.NET AJAX hizmetleri tarafından kullanılan varsayılan veri biçimidir.
Bu biçim, ASP.NET ile tümleştirmeden AJAX hizmetleri oluştururken de kullanılabilir. Bu durumda XML varsayılandır ancak JSON seçilebilir.
Son olarak, JSON desteğine ihtiyacınız varsa ancak bir AJAX hizmeti oluşturmuyorsanız DataContractJsonSerializer, .NET nesnelerini doğrudan JSON verilerine seri hale getirmenizi ve bu verileri .NET türlerinin örneklerine geri dönüştürmenizi mümkün kılar. Bunun nasıl yapılacağının açıklaması için bkz . Nasıl yapılır: JSON Verilerini Seri Hale Getirme ve Seri Durumdan Çıkarma.
JSON ile çalışırken, DataContractSerializer tarafından desteklenen birkaç istisna dışında, aynı .NET türleri desteklenir. Desteklenen türlerin listesi için bkz. Veri Sözleşmesi Seri Hale Getiricisi Tarafından Desteklenen Türler. Bu, çoğu ilkel tür, çoğu dizi ve koleksiyon türünün yanı sıra DataContractAttribute ve DataMemberAttribute kullanan karmaşık türleri içerir.
.NET türlerini JSON türleriyle eşleme
Aşağıdaki tabloda, serileştirme ve seri durumdan çıkarma yordamlarıyla eşlendiğinde .NET türleri ile JSON/JavaScript türleri arasındaki yazışma gösterilmektedir.
| .NET Türleri | JSON/JavaScript | Notlar |
|---|---|---|
| Tüm sayısal türler, örneğin Int32, Decimal veya Double | Sayı | gibi Double.NaNDouble.PositiveInfinityDouble.NegativeInfinity özel değerler desteklenmez ve geçersiz JSON ile sonuçlanır. |
| Enum | Sayı | Bu makalenin devamında yer alan "Numaralandırmalar ve JSON" bölümüne bakın. |
| Boolean | Boolean (Boole Mantığı) | |
| String, Char | Dize | |
| TimeSpan, Guid, Uri | Dize | JSON'da bu türlerin biçimi XML ile aynıdır (temelde, ISO 8601 Süre formatında zaman aralığı, "12345678-ABCD-ABCD-ABCD-1234567890AB" formatında GUID ve URI'nin doğal dize biçiminde, örneğin "http://www.example.com" şeklinde ifade edilir). Kesin bilgi için bkz. Veri Sözleşmesi Şema Başvurusu. |
| XmlQualifiedName | Dize | Biçim "name:namespace" şeklindedir (ilk iki nokta üst üsteden önceki her şey addır). Ad veya ad alanı eksik olabilir. Ad alanı yoksa iki nokta da atlanabilir. |
Command türü System.Windows.Input.ICommand |
Sayı dizisi | Her sayı bir bayt değerini temsil eder. |
| DateTime | DateTime veya Dizgi | Bu makalenin devamında Tarihler/Saatler ve JSON konularını inceleyin. |
| DateTimeOffset | Karmaşık tür | Bu makalenin devamında Tarihler/Saatler ve JSON konularını inceleyin. |
| XML ve ADO.NET türleri (XmlElement, XElement. dizileri XmlNode. ISerializable, DataSet. ) |
Dize | Bu makalenin XML Türleri ve JSON bölümüne bakın. |
| DBNull | Boş karmaşık tür | -- |
| Koleksiyonlar, sözlükler ve diziler | Dizi | Bu konunun Koleksiyonlar, Sözlükler ve Diziler bölümüne bakın. |
| Karmaşık türler ( DataContractAttribute veya SerializableAttribute uygulanmış) | Karmaşık tür | Veri üyeleri JavaScript karmaşık veri türünün üyesi olur. |
| Arabirimi uygulayan ISerializable karmaşık türler) | Karmaşık tür | Diğer karmaşık türlerle aynı ancak bazı ISerializable türler desteklenmez. Bkz. ISerializable Desteği. |
Null herhangi bir tür için değer |
Sıfır | Null atanabilir değer türleri de desteklenir ve JSON ile null atanamayan değer türleriyle aynı şekilde eşlenir. |
Numaralandırmalar ve JSON
Numaralandırma üyesi değerleri, üye adları olarak dahil edildikleri veri sözleşmelerinde işlenmelerinden farklı olan JSON'da sayı olarak değerlendirilir. Veri sözleşmesi işlemi hakkında daha fazla bilgi için bkz. Veri Sözleşmelerinde Numaralandırma Türleri.
Örneğin,
public enum Color {red, green, blue, yellow, pink}varsa,yellow'in seri hale getirilmesi "sarı" dizesini değil 3 sayısını üretir.Tüm
enumüyeler serileştirilebilir. EnumMemberAttribute ve NonSerializedAttribute öznitelikleri kullanıldığında yoksayılır.Var olmayan
enumbir değerin seri durumdan çıkarılması mümkündür; örneğin, 87 değeri, karşılık gelen renk adı tanımlanmamış olsa bile önceki Color sabit listesinde seri durumdan çıkarılabilir.Bayraklar
enumözel değildir ve diğerenumile aynı şekilde işlenir.
Tarihler/saatler ve JSON
JSON biçimi tarihleri ve saatleri doğrudan desteklemez. Ancak, bunlar çok yaygın olarak kullanılır ve AJAX ASP.NET bu türler için özel destek sağlar. ASP.NET AJAX proxy'lerini kullanırken. DateTime .NET türü, JavaScript'teki türe DateTime tamamen karşılık gelir.
ASP.NET kullanmadığınızda, JSON'da bir DateTime tür, bu konunun Gelişmiş Bilgiler bölümünde açıklanan özel bir biçime sahip bir dize olarak temsil edilir.
DateTimeOffset JSON'da karmaşık bir tür olarak temsil edilir: {"DateTime":d ateTime,"OffsetMinutes":offsetMinutes}. Üye
offsetMinutes, Greenwich Ortalama Saati (GMT) ile artık Koordinatlı Evrensel Saat (UTC) olarak da bilinen yerel saat farkıdır ve ilgili etkinliğin konumuyla ilişkili. ÜyedateTime, ilgilendiğiniz olayın gerçekleştiği zamanı temsil eder (ASP.NET AJAX kullanıldığında JavaScript'te tekrar birDateTimeolur, kullanılmadığında ise bir dizeye dönüşür). SerileştirmededateTimeüye her zaman GMT'de serileştirilir. Bu nedenle, New York saati 03:00'te açıklanıyorsa,dateTimesaat bileşeni 08:00'dır veoffsetMinutes300'tür (GMT'den eksi 300 dakika veya 5 saat).Uyarı
DateTime ve DateTimeOffset nesneleri, JSON'a seri hale getirildiğinde yalnızca milisaniyelik duyarlık için bilgileri korur. Serileştirme sırasında milisaniye alt değerleri (mikro/nanosaniye) kaybolur.
XML türleri ve JSON
XML türleri JSON dizelerine dönüşür.
Örneğin, XElement türünde bir "q" veri üyesi abc/< içeriyorsa>, JSON şudur: {"q":"<abc/>"}.
XML'nin nasıl sarmalandığını belirten bazı özel kurallar vardır. Daha fazla bilgi için bu makalenin devamında yer alan Gelişmiş Bilgiler bölümüne bakın.
ASP.NET AJAX kullanıyorsanız ve JavaScript'te dize kullanmak istemiyor, bunun yerine XML DOM kullanmak istiyorsanız, ResponseFormat üzerinde WebGetAttribute özelliğini XML olarak ayarlayın veya ResponseFormat üzerinde WebInvokeAttribute özelliğini XML olarak ayarlayın.
Koleksiyonlar, sözlükler ve diziler
Tüm koleksiyonlar, sözlükler ve diziler JSON'da diziler olarak temsil edilir.
Herhangi bir CollectionDataContractAttribute kullanan özelleştirme JSON gösteriminde yoksayılır.
Sözlükler doğrudan JSON ile çalışmanın bir yolu değildir. Sözlük<dizesi,nesne> WCF'de diğer JSON teknolojileriyle çalışmaktan beklendiği gibi desteklenmeyebilir. Örneğin, "abc" "xyz" ile eşlenirse ve "def" bir sözlükte 42 ile eşlenirse, JSON gösterimi {"abc":"xyz","def":42} değil, [{"Key":"abc","Value":"xyz"},{"Key":"def","Value":42}] olur.
Doğrudan JSON ile çalışmak istiyorsanız (anahtarlara ve değerlere dinamik olarak erişmek, katı bir sözleşmeyi önceden tanımlamadan), çeşitli seçenekleriniz vardır:
Zayıf türdeki JSON Serileştirme (AJAX) örneğini kullanmayı göz önünde bulundurun.
ISerializable arabirimini ve seri durumdan çıkarma oluşturucularını kullanmayı göz önünde bulundurun - bu iki mekanizma, sırasıyla serileştirme ve seri durumdan çıkarma üzerinde JSON anahtar/değer çiftlerine erişmenize olanak sağlar, ancak kısmi güven senaryolarında çalışmaz.
Seri hale getirici kullanmak yerine JSON ve XML Arasında Eşleme ile çalışmayı göz önünde bulundurun.
Serileştirme bağlamında polimorfizm , temel türünün beklendiği türetilmiş bir türü seri hale getirme özelliğini ifade eder. Polimorfik olarak koleksiyonlar kullanıldığında, örneğin bir koleksiyonun Object'ye atanması durumunda, JSON'a özgü özel kurallar vardır. Bu sorun, bu makalenin devamında Yer alan Gelişmiş Bilgiler bölümünde daha ayrıntılı olarak ele alınmalıdır.
Ek ayrıntılar
Veri Üyeleri Sırası
JSON kullanılırken veri üyelerinin sırası önemli değildir. Özellikle de, Order ayarlanmış olsa bile JSON verileri herhangi bir sırada seri durumdan çıkarılabilir.
JSON Türleri
Seri durumdan çıkarmada JSON türünün önceki tabloyla eşleşmesi gerekmez. Örneğin, normalde bir Int JSON numarasıyla eşlenir, ancak bu dize geçerli bir sayı içerdiği sürece bir JSON dizesinden de başarıyla seri durumdan çıkarılabilir. Başka bir ifadeyle, "q" adlı bir Int veri üyesi varsa hem {"q":42} hem de {"q":"42"} geçerli olur.
Çok biçimlilik
Polimorfik serileştirme, temel türünün beklendiği türetilmiş bir türü seri hale getirme özelliğinden oluşur. WCF, XML serileştirmenin desteklenme biçimine benzer şekilde JSON serileştirmesi için destek sağlar. Örneğin, MyDerivedType beklenirken MyBaseType'ı seri hale getirebilir veya Int beklenirken Object'yi seri hale getirebilirsiniz.
Türetilmiş bir türü seri durumdan çıkarırken temel tür bekleniyorsa, karmaşık bir türü seri durumdan çıkarmadığınız sürece tür bilgileri kaybolabilir. Örneğin, Uri beklendiği yerde Object serileştirilirse, bu bir JSON dizesiyle sonuçlanır. Bu dize daha sonra Object içinde seri durumdan çıkarılırsa, bir .NET String döndürülür. Seriden çıkarıcı, dizenin başlangıçta türünde Uri olduğunu bilmiyor. Genellikle, Object beklenirken, tüm JSON dizeleri .NET dizeleri olarak çözülür ve .NET koleksiyonlarını, sözlüklerini ve dizilerini seri hale getirmek için kullanılan tüm JSON dizileri, gerçek özgün türün ne olduğuna bakılmaksızın, Array türündeki .NET Object olarak çözülür. JSON boole değeri bir .NET Boolean ile eşlenir. Ancak Object beklenirken, JSON sayıları en uygun türün otomatik olarak seçildiği .NET Int32, Decimal veya Double olarak seri durumdan çıkarılır.
Bir arabirim türüne seri durumdan DataContractJsonSerializer çıkarılırken, bildirilen tür nesneymiş gibi seri durumdan çıkar.
Kendi temel ve türetilmiş türlerinizle çalışırken KnownTypeAttribute, ServiceKnownTypeAttribute veya eşdeğer bir mekanizma kullanmak normalde gereklidir. Örneğin, bir dönüş değeri olan Animal işlemine sahipseniz ve aslında Cat türünden türetilmiş bir Animal örneği döndürüyorsa, KnownTypeAttribute özelliğini ya Animal türüne ya da ServiceKnownTypeAttribute işlemi üzerinde uygulamalı ve bu özniteliklerde Cat türünü belirtmelisiniz. Daha fazla bilgi için bkz. Veri Sözleşmesi Bilinen Türleri.
Polimorfik serileştirmenin nasıl çalıştığına ilişkin ayrıntılar ve kullanırken dikkat edilmesi gereken bazı sınırlamaların tartışılması için, bu makalenin devamında yer alan Gelişmiş Bilgiler bölümüne bakın.
Sürüm oluşturma
Arabirim de dahil olmak üzere IExtensibleDataObject veri sözleşmesi sürüm oluşturma özellikleri JSON'da tam olarak desteklenir. Ayrıca, çoğu durumda bir türün seri durumdan çıkarılması (örneğin, XML) ve ardından bunu başka bir biçimde seri hale getirmek (örneğin, JSON) ve yine de içindeki IExtensibleDataObjectverileri korumak mümkündür. Daha fazla bilgi için bkz. Forward-Compatible Veri Sözleşmeleri. JSON'un sırasız olduğunu ve bu nedenle herhangi bir sıra bilgisinin kaybolacağını unutmayın. Ayrıca, JSON aynı anahtar adına sahip birden çok anahtar/değer çiftini desteklemez. Son olarak, IExtensibleDataObject üzerindeki tüm işlemler doğası gereği polimorfiktir; yani türetilmiş türleri, tüm türlerin temel türü olan Object'e atanır.
URL'lerde JSON
HTTP GET fiiliyle (özniteliğini kullanarak WebGetAttribute ) ASP.NET AJAX uç noktalarını kullanırken, gelen parametreler ileti gövdesi yerine istek URL'sinde görünür. JSON, istek URL'sinde bile desteklenir; bu nedenle, "sayı" olarak adlandırılan bir Int ve "p" adlı karmaşık bir türü içeren bir Person işleminiz varsa, URL aşağıdaki URL'ye benzeyebilir.
http://example.com/myservice.svc/MyOperation?number=7&p={"name":"John","age":42}
Hizmeti çağırmak için ASP.NET AJAX Betik Yöneticisi denetimi ve ara sunucusu kullanıyorsanız, bu URL proxy tarafından otomatik olarak oluşturulur ve görünmez. JSON, non-ASP.NET AJAX uç noktalarındaki URL'lerde kullanılamaz.
Gelişmiş bilgiler
ISerializable Desteği
Desteklenen ve Desteklenmeyen ISerializable Türleri
Genel olarak, ISerializable arabirimini uygulayan türler JSON seri hale getirme/durumdan çıkarma işlemleri sırasında tam desteklenir. Ancak, bu türlerden bazıları (bazı .NET Framework türleri dahil) JSON'a özgü serileştirme yönlerinin, bunların doğru bir şekilde seri durumdan çıkarılmamasına yol açacak şekilde uygulanmıştır.
ile ISerializable, tek tek veri üyelerinin türü önceden asla bilinmez. Bu, türleri bir nesne içine seriden çıkarmaya benzer çok biçimli bir duruma yol açar. Daha önce belirtildiği gibi, bu JSON'da tür bilgilerinin kaybolmasına neden olabilir. Örneğin,
enumuygulamasında bir ISerializable öğesini seri hale getiren ve düzgün tip dönüşümleri olmadan doğrudan birenumiçine seri durumdan çıkarmaya çalışan bir tür başarısız olur, çünkü birenumJSON içerisindeki sayıları kullanarak seri hale getirilir ve JSON sayıları yerleşik .NET sayısal türlerine (Int32, Decimal veya Double) seri durumdan çıkarılır. Bu nedenle, eskidenenumbir değer olan sayının özelliği kaybolur.Belirli bir sıralamada seri durumdan çıkarmaya ihtiyaç duyan bir ISerializable türü, seri durumdan çıkarma işlemi sırasında bazı JSON verilerini doğru bir şekilde işleyemeyebilir, çünkü çoğu JSON seri hale getirici, belirli bir sıralamayı garanti etmemektedir.
Fabrika Türleri
IObjectReference Arabirim genel olarak JSON'da destekleniyor olsa da, "fabrika türü" özelliğini gerektiren türler (arabirimi uygulayan türden farklı bir türün GetRealObject(StreamingContext) örneğini döndürme) desteklenmez.
DateTime Tel Biçimi
DateTime değerleri "/Date(700000+0500)/" biçiminde JSON dizeleri olarak görünür; burada ilk sayı (sağlanan örnekte 700000) GMT saat dilimindeki milisaniye sayısıdır ve 1 Ocak 1970 gece yarısından bu yana normal (yaz saati olmayan) saattir. Sayı, önceki zamanları temsil etmek için negatif olabilir. Örnekteki "+0500" öğesini içeren bölüm isteğe bağlıdır ve saatin Local türünde olduğunu, yani seri durumdan çıkarmada yerel saat dilimine dönüştürülmesi gerektiğini gösterir. Eğer yoksa, zaman Utc olarak seri durumdan çıkarılır. Asıl sayı ("0500 bu örnekteki") ve işareti (+ veya -) görmezden gelinir.
seri hale getirildiğinde DateTime, Local ve Unspecified zamanları bir kaydırma ile yazılırken, Utc kaydırma olmadan yazılır.
ASP.NET AJAX istemcisi JavaScript kodu bu tür dizeleri otomatik olarak JavaScript DateTime örneklerine dönüştürür. .NET türünde olmayan DateTime benzer bir forma sahip başka dizeler varsa, bunlar da dönüştürülür.
Dönüştürme yalnızca "/" karakterlerinden kaçıldığında gerçekleşir (yani, JSON "\/Date(700000+0500)\/") gibi görünür ve bu nedenle WCF'nin JSON kodlayıcısı (tarafından etkinleştirilmiştir WebHttpBinding) her zaman "/" karakterinden kaçar.
JSON Dizelerinde XML
XmlElement
XmlElement, herhangi bir sarmalama olmadan olduğu gibi seri hale getirilir. Örneğin, abc/XmlElement içeren <türün > "x" veri üyesi aşağıdaki gibi temsil edilir:
{"x":"<abc/>"}
XmlNode Dizileri
Array türündeki XmlNode nesneler, türü için standart veri sözleşmesi ad alanında ArrayOfXmlNode adlı bir öğeye sarmalanmıştır. "x", "ns" ad alanında "değer" ve boş öğe düğümü "M" içeren "N" öznitelik düğümünü içeren bir diziyse, gösterim aşağıdaki gibidir.
{"x":"<ArrayOfXmlNode xmlns=\"http://schemas.datacontract.org/2004/07/System.Xml\" a:N=\"value\" xmlns:a=\"ns\"><M/></ArrayOfXmlNode>"}
XmlNode dizilerinin başındaki boş ad alanındaki öznitelikler (diğer öğelerden önce) desteklenmez.
XElement ve DataSet gibi IXmlSerializable Türleri
ISerializable " içerik türleri", "DataSet türleri" ve "öğe türleri" olarak alt bölümlere ayrılır. Bu türlerin tanımları için bkz. Veri Sözleşmelerinde XML ve ADO.NET Türleri.
"Content" ve "DataSet" türleri, önceki bölümde Array nesneleriyle benzer XmlNode nesneleri gibi serileştirilir. Adı ve ad alanı söz konusu türün veri sözleşmesi adına ve ad alanına karşılık gelen bir öğeye sarmalanmıştır.
gibi XElement "Öğe" türleri, bu makalede daha önce ele alınana XmlElement benzer şekilde seri hale getirilir.
Çok biçimlilik
Tür Bilgilerini Koruma
Daha önce belirtildiği gibi, JSON'da bazı sınırlamalarla polimorfizm desteklenir. JavaScript zayıf türde bir dildir ve tür kimliği genellikle sorun yaratmaz. Ancak, güçlü türe sahip bir sistem (.NET) ile zayıf türe sahip bir sistem (JavaScript) arasında iletişim kurmak için JSON kullanırken, tür kimliğini korumak yararlı olur. Örneğin, veri sözleşmesi adları "Kare" ve "Daire" olan türler, veri sözleşmesi adı "Şekil" olan bir türden türetilir. "Daire" .NET'ten JavaScript'e gönderilir ve daha sonra "Şekil" bekleyen bir .NET yöntemine döndürülürse, .NET tarafının söz konusu nesnenin başlangıçta bir "Daire" olduğunu bilmesi yararlıdır; aksi takdirde türetilen türe özgü tüm bilgiler (örneğin, "Daire" üzerindeki "radius" veri üyesi) kaybolabilir.
Tür kimliğini korumak için, karmaşık türler JSON'a serileştirilirken bir "tür ipucu" eklenebilir ve deserileştirici ipucunu tanır ve uygun şekilde davranır. "Tür ipucu", anahtar adı "__type" olan bir JSON anahtarı/değer çiftidir (iki alt çizgi ve ardından "tür" sözcüğü). Değer, "DataContractName:DataContractNamespace" biçiminde bir JSON dizesidir (ilk iki nokta üst üste kadar olan her şey addır). Önceki örnek kullanılarak "Daire" aşağıdaki gibi seri hale getirilebilir.
{"__type":"Circle:http://example.com/myNamespace","x":50,"y":70,"radius":10}
Tip ipucu, XML Şema Örneği standardı tarafından tanımlanan xsi:type özniteliğine çok benzer ve XML serileştirme/seriden çıkartma sırasında kullanılır.
Tür ipucuyla olası çakışma nedeniyle "__type" olarak adlandırılan veri üyeleri yasaktır.
Tür İpuçlarının Boyutunu Küçültme
JSON iletilerinin boyutunu küçültmek için, varsayılan veri sözleşmesi ad alanı ön eki (http://schemas.datacontract.org/2004/07/) "#" karakteriyle değiştirilir. (Bu değiştirmenin geri döndürülebilir olmasını sağlamak için bir kaçış kuralı kullanılır: Ad alanı "#" veya "\" karakterleriyle başlıyorsa, bunlar fazladan bir "\" karakterle eklenir). Bu nedenle, "Daire" "MyApp.Shapes" .NET ad alanında bir türse, varsayılan veri sözleşmesi ad alanı http://schemas.datacontract.org/2004/07/MyApp olarak olur. Şekiller ve JSON gösterimi aşağıdaki gibidir.
{"__type":"Circle:#MyApp.Shapes","x":50,"y":70,"radius":10}
Hem kesilmiş (#MyApp.Şekiller) hem de tam (http://schemas.datacontract.org/2004/07/MyApp.Shapes) adlar serileştirme sırasında anlaşılmaktadır.
JSON Nesnelerinde Tür İpucu Konumu
Tür ipucunun ilk olarak JSON gösteriminde görünmesi gerektiğini unutmayın. JSON işlemesinde anahtar/değer çiftlerinin sırasının önemli olduğu tek durum budur. Örneğin, aşağıdaki tür ipucunu belirtmek için geçerli bir yol değildir.
{"x":50,"y":70,"radius":10,"__type":"Circle:#MyApp.Shapes"}
Hem WCF hem de ASP.NET AJAX istemci sayfaları tarafından kullanılan DataContractJsonSerializer her zaman önce tür ipucunu yayar.
Tür İpuçları Yalnızca Karmaşık Türlere Uygulanır
Karmaşık olmayan türler için bir tür ipucu yaymak için hiçbir yol yoktur. Örneğin, bir işlemin Object dönüş tipi varsa ve daire döndürüyorsa, JSON gösterimi daha önce gösterildiği gibi olabilir ve tür bilgileri korunur. Ancak, Uri döndürülürse, JSON gösterimi bir dizedir ve Uri'yi temsil etmek için kullanılan dize kaybolur. Bu yalnızca ilkel türler için değil koleksiyonlar ve diziler için de geçerlidir.
Tür İpuçları Ne Zaman Çıkıyor?
Tür ipuçları ileti boyutunu önemli ölçüde artırabilir (bunu azaltmanın bir yolu, mümkünse daha kısa veri sözleşmesi ad alanlarını kullanmaktır). Bu nedenle, tür ipuçlarının yayılıp yayılmayacağını aşağıdaki kurallar yönetir:
ASP.NET AJAX kullanılırken, bir temel/türetilmiş atama olmasa bile, örneğin bir Daire başka bir Daire'ye atanmış olsa bile, tür ipuçları her zaman mümkün olduğunda oluşturulur. (Bu, zayıf tür JSON ortamından kesin tür .NET ortamına beklenmeyen bilgi kaybı olmadan çağrı yapma sürecini tam olarak etkinleştirmek için şarttır.)
AJAX hizmetlerini ASP.NET entegrasyonu olmadan kullanırken, tür ipuçları yalnızca bir temel/türetilmiş atama olduğunda yayımlanır; yani, Daire Şekle veya Object'e atandığında yayımlanır ancak Daireye atandığında yayımlanmaz. Bu, JavaScript istemcisini doğru uygulamak için gereken en düşük bilgileri sağlar, bu nedenle performansı artırır, ancak yanlış tasarlanmış istemcilerde tür bilgisi kaybına karşı koruma sağlamaz. İstemcide bu sorunla uğraşmaktan kaçınmak istiyorsanız sunucuda temel/türetilmiş atamalardan tamamen kaçının.
oluşturucu parametresi türü kullanırken DataContractSerializer ,
alwaysEmitTypeInformationönceki iki mod arasında seçim yapmanıza olanak tanır ve varsayılan değer "false" olur (yalnızca gerektiğinde tür ipuçlarını yayar).
Yinelenen Veri Üyesi Adları
Türetilmiş tür bilgileri aynı JSON nesnesinde temel tür bilgileriyle birlikte bulunur ve herhangi bir sırada oluşabilir. Örneğin, Shape aşağıdaki gibi temsil edilebilir.
{"__type":"Shape:#MyApp.Shapes","x":50,"y":70}
Ancak Circle aşağıdaki gibi temsil edilebilir.
{"__type":"Circle:#MyApp.Shapes","x":50, "radius":10,"y":70}
Temel Shape türü aynı zamanda "radius" adlı bir veri üyesi de içeriyorsa, bu durum hem serileştirme (çünkü JSON nesneleri yinelenen anahtar adlarına sahip olamaz) hem de seri durumdan çıkarma sırasında Shape.radius ile çakışmaya neden olur (çünkü "radius"un Shape.radius mi yoksa mi olduğunu belirlemek zordur). Bu nedenle, veri sözleşmesi sınıflarında "özellik gizleme" kavramı (temel ve türetilmiş sınıflarda aynı ada sahip veri üyeleri) genellikle önerilmez, ancak JSON söz konusu olduğunda aslında yasaktır.
Polimorfizm ve IXmlSerializable Türleri
IXmlSerializable türler, bilinen tür gereksinimleri karşılandığı sürece, her zamanki veri sözleşmesi kurallarına göre birbirine çok biçimli olarak atanabilir. Ancak, bir IXmlSerializable türün Object yerine seri hale getirildiğinde, sonuç bir JSON dizesi olduğundan tür bilgilerinin kaybına neden olur.
Polimorfizm ve Belirli Arabirim Türleri
Hangi türün serileştirileceği beklenirken, IXmlSerializable türü hariç, IXmlSerializable olmayan bir koleksiyon tipi veya Object uygulayan bir koleksiyon tipi serileştirmek yasaktır. Örneğin, IMyInterface adlı özel bir arabirim ve MyType türü ile hem IEnumerable<T> hem de int ve IMyInterface türlerini uygulayan bir tür. Bir işlemin dönüş türü MyType olduğunda, IMyInterface ile geri dönmek yasaktır. Bunun nedeni, MyType'nin bir JSON dizisi olarak seri hale getirilmesi ve bir tür ipucu gerektirmesidir. Daha önce belirtildiği gibi, dizilerle bir tür ipucu kullanamazsınız, yalnızca karmaşık türlerle kullanılabilir.
Bilinen Türler ve Yapılandırma
DataContractSerializer tarafından kullanılan tüm Bilinen Tür mekanizmaları aynı şekilde DataContractJsonSerializer tarafından da desteklenir. Her iki seri hale getirici de bir yapılandırma dosyası aracılığıyla eklenen bilinen türleri bulmak için system.runtime.serialization< dosyasındaki>dataContractSerializer< adlı aynı yapılandırma öğesini okur.>
Nesneye Atanan Koleksiyonlar
Object'e atanan koleksiyonlar, IEnumerable<T>'i uygulayan koleksiyonlar gibi serileştirilir: Eğer karmaşık bir türse, her girişin tür ipucuyla JSON dizisi halinde olur. Örneğin, List<T> atanmış bir Shape türünden Object aşağıdaki gibi görünür.
[{"__type":"Shape:#MyApp.Shapes","x":50,"y":70},
{"__type":"Shape:#MyApp.Shapes","x":58,"y":73},
{"__type":"Shape:#MyApp.Shapes","x":41,"y":32}]
Yeniden Object içerisine seri durumdan çıkarıldığında:
ShapeBilinen Türler listesinde olmalıdır. Bilinen türlerde türe List<T> sahip olmanınShapehiçbir etkisi yoktur. Bu durumda serileştirmede bilinen türlere eklemenizShapegerekmediğini unutmayın. Bu işlem otomatik olarak yapılır.Koleksiyon, Array örneklerini içeren bir Object türü
Shapeolarak seri durumdan çıkarılır.
Temel Koleksiyonlara Atanan Türetilmiş Koleksiyonlar
Türetilmiş bir koleksiyon bir temel koleksiyona atandığında, koleksiyon genellikle temel türdeki bir koleksiyonmuş gibi serileştirilir. Ancak, türetilmiş koleksiyonun öğe türü temel koleksiyonun öğe türüne atanamazsa, bir özel durum oluşturulur.
Tür İpuçları ve Sözlükler
Object'ye bir sözlük atandığında, sözlükteki her Anahtar ve Değer girdisi Object'ye atanmış gibi değerlendirilir ve bir tür ipucu alır.
Sözlük türlerini seri hale getirirken, "Anahtar" ve "Değer" üyelerini içeren JSON nesnesi alwaysEmitTypeInformation ayarından etkilenmez ve yalnızca önceki koleksiyon kuralları gerektirdiğinde bir tür ipucu içerir.
Geçerli JSON Anahtar Adları
Seri hale getirici XML, geçerli XML adları olmayan anahtar adlarını kodlar. Örneğin, "123" adlı bir veri üyesinin "_x0031__x0032__x0033_" gibi kodlanmış bir adı olur çünkü "123" geçersiz bir XML öğesi adıdır (basamakla başlar). Xml adlarında geçerli olmayan bazı uluslararası karakter kümelerinde de benzer bir durum ortaya çıkabilir. XML'nin JSON işleme üzerindeki bu etkisinin açıklaması için bkz. JSON ile XML Arasında Eşleme.