Soru Sözlük WCF ile nasıl serileştirilir?


Yazılı bir veri girişi ile veri sözleşmem var Dictionary<string, string>.

Oluşturulan web servis referansı, bu tür bir üye olarak ortaya çıkarır ArrayOfKeyValueOfstringstringKeyValueOfstringstring[].

Bunu daha önce gören oldu mu?


21
2017-10-02 15:16


Menşei


Bu sayfaya WCF dokümantasyonuna bir göz atmak isteyebilirsiniz (bu sorudan çok daha yeni olan): docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/... - Matt Varblow


Cevaplar:


WCF sadece serileştirir yapıÇünkü, tel üzerinde bitenler için yararlı olacak kadar kendi kendine yeterli olmalıdır. herhangi istemci, sadece .NET istemcileri değil.

Farklı bir platformda geliştirilen bazı müşteriler, bir 'sözlük' kavramını paylaşmayabilir, bu nedenle bir Sözlüğü, altta yatan sınıf hakkında örtük bir bilgi taşıyan bir temsile serileştirmek çok zor olurdu.

Müşteri, nesne yönelimli bile olmayabilir.

Bir sözlük daha fazla yapı - Ayrıca davranış içerir (örneğin, zaten var olan bir anahtara atandığınızda, bu tuşun üzerine yazdığınız vb.) ve bu davranış telin üzerinden geçemez.

Başka bir deyişle, Sözlükler ve diğer birçok .NET türü birlikte çalışamaz, bu yüzden WCF bunları ServiceContract'ta korumaya çalışamaz.

Verileriniz için özel bir DataContract tasarlamanız daha iyi olur.


24
2017-10-02 15:25



Bu, istemcinin verinin bir sözlük haline dönüştürülmesi için istemci vekilinin üretilemeyeceği anlamına gelmez. Visual Studio'nun "Hizmet Referansını Yapılandır" iletişim kutusunun "Sözlük Koleksiyonu Türü" seçeneği, System.Collections.Generic.Dictionary olarak ayarlandığında ne yapar? - xr280xr


WCF'nin her şeyi XML'e dönüştürmesi gerektiğinden, XML olarak sığdırmak zorundadır ... Koleksiyonlar genellikle dizilere dönüştürülür.

Bir Sözlük, xml olarak temsil etmek için zor bir tercihtir, bu yüzden diğer tarafta bu tür bir tane var. Oluşturulan proxy kodundaki diziler yerine belirli koleksiyonları kullanmak için SvcUtil.exe'yi belirtebilirsiniz, ancak bir Sözlük için çalışacağından emin değilim. Burada bir Sözlük kullanmamalı ve daha basit bir Koleksiyon kullanmalısınız.

Yapmam gereken şey kendi veri tipimi oluşturmak, [DataContract], onu iki tür String türü yapmak ve sonra Sözlük'te bulduğunuz her şeyi doldurmak için bir Koleksiyon haline getirmektir. Ardından bu Koleksiyonu telden geçirin ve ardından diğer taraftaki bir Sözlüğe geri dönüştürün.


5
2017-10-02 15:26



sadece <entry key = "blah"> de dah </ entry> dizisi gibi bir şey değil mi? - kenny
@Kenny: Hayır, standart DataContractSerializer XML düğümlerindeki öznitelikleri desteklemiyor (performans nedenleriyle) - marc_s
@kenny: açıkçası. Evet. ve çok doğal anahtar ve değer xml öğeleri kullanarak, seri hale getirilebilir sözlükler yazan birçok insan var. sözlük sadece çiftlerin listesidir. Tek geçerli argüman, Mark Seemann'ın davranış hakkındadır. Ama bir sözlük kesinlikle xml'de temsil etmek zor değildir. Ayrıca python, sözlüklerin kodlarını aynı şekilde kullanarak iyi bir şekilde dizgeleştirir! sadece yap str(mydict)Onu almak için. - v.oddou


Bunu yapmanın bir yolu var. Operasyon sözleşmesi aslında bir dizedir. Bir ipi tutmak için json dizisinden kaçtım. Daha sonra web yönteminde dizeyi unescape ve NewtonSoftJson kullanarak bir sözlük haline getirdim. Sözlük kullandım ama eğer istersen Sözlük de yapabilirsin. Umarım bu yararlıdır ...

NewtonSoft Json kütüphanesini kullandım ...

c # kodu

using Newtonsoft.Json;
[OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json)]
    public void testMethod(string jsonData)
    {
        string data = Uri.UnescapeDataString(jsonData);
        Dictionary<string, string> x = jsonConvert.DeserializeObject<Dictionary<string, string>>(data);
        foreach (KeyValuePair<string, string> kvp in x)
        {

        }
    }

JSCode

var Data = {
    width: 400,
    height: 200,
    someString: "somedata"
};

$.ajax({
    type: "POST",
    url: "Service1.svc/testMethod",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    timeout: 1000000,               
    data:  '{"jsonData": "' + escape(JSON.stringify(Data)) + '"}',
    error: function(error) {
    },
    success: function (data) {
    },
});

1
2018-01-30 11:54