Aracılığıyla paylaş


DataContractJsonSerializer kullanarak tek başına JSON serileştirme

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 enum bir 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ğer enum ile 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. Üye dateTime, ilgilendiğiniz olayın gerçekleştiği zamanı temsil eder (ASP.NET AJAX kullanıldığında JavaScript'te tekrar bir DateTime olur, kullanılmadığında ise bir dizeye dönüşür). Serileştirmede dateTime üye her zaman GMT'de serileştirilir. Bu nedenle, New York saati 03:00'te açıklanıyorsa, dateTime saat bileşeni 08:00'dır ve offsetMinutes 300'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, enum uygulamasında bir ISerializable öğesini seri hale getiren ve düzgün tip dönüşümleri olmadan doğrudan bir enum içine seri durumdan çıkarmaya çalışan bir tür başarısız olur, çünkü bir enum JSON 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, eskiden enum bir 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:

  • Shape Bilinen Türler listesinde olmalıdır. Bilinen türlerde türe List<T> sahip olmanın Shape hiçbir etkisi yoktur. Bu durumda serileştirmede bilinen türlere eklemeniz Shape gerekmediğini unutmayın. Bu işlem otomatik olarak yapılır.

  • Koleksiyon, Array örneklerini içeren bir Object türü Shape olarak 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.

Ayrıca bakınız