Soru WCF'de [Serializable] yerine [DataContract] kullanmanın avantajları nelerdir?


DataContract'ı kullanmanın herhangi bir avantajı var mı?


25
2018-01-25 10:19


Menşei




Cevaplar:


Harika görün XmlSerializer ve DataContractSerializer karşılaştırması Dan Rigsby'nin bloğunda.

DataContractSerializer'ın lehine bazı noktalar:

  • XmlSerializer'dan yaklaşık% 10 daha hızlı
  • bir şey ile dekore edilmiş bir şeyi serileştirir [DataMember] - olmasa bile public gözle görülür
  • hiçbir şeyi serileştirmeyecek olmadıkça özellikle bunu ("dahil")
  • kullanarak öğelerin serileştirildiği sırayı tanımlayabilirsiniz. Order= üzerinde özellik [DataMember]
  • serileştirme için parametresiz bir kurucu gerektirmez

35
2018-01-25 10:21





Burada diğerleri tarafından henüz cevaplanmamış bir soru var: Ne kullanırsan [Serializable]ama yine de kullan DataContractSerializer Bu tür serileştirmek için? Bir serileştirmeden farklı mı [DataContract] ile yaz DataContractSerializer?

Cevap: yapar kesinlikle fark yok! Bunun nedeni, desteklenen her tür DataContractSerializerİlk serileştirme ya da serileştirme bölümünde, türün üyeleri ile ilgili tüm bilgileri içeren bir iç yapıya "parçalar". Daha sonra serileştirme bölümleri için önbelleğe alınmış dahili yapıyı (dinamik IL kullanılarak korunur) kullanır. orijinal türüne dön

Ayrıca, karşılaştırıyorsanız DataContractSerializerserileştirilmesi [Serializable] vs XmlSerializeraynı tiplerin serileştirilmesi, bulacaksınız DataContractserileştirilmesi katlanarak daha hızlı. Buradaki performans karşılaştırma teknik incelemesinde bunun bir kısmı görülebilir: http://msdn.microsoft.com/en-us/library/bb310550.aspx


10
2018-02-09 17:23



Bu aslında OP'nin sorusunu cevaplar. - i3arnon
Soruyu nasıl daha iyi bir şekilde cevaplandırdığını göremiyorum, bu yüzden yorumların yorumlanması bana mantıklı gelmiyor. Seçilen cevap daha kesin bir cevap olarak görünüyor, ancak bu bazı ek bilgiler sağlıyor. - shawn1874
O zamandan beri DTO'larla çalışırken en iyi seçenek budur. her şey Zaten seri hale getirilmesi gerekiyor. Opt-in avantajı DataContract o zaman sıfırdır. - Alexander Derck


DataContract'ın XmlSerializer'dan daha tüketici odaklı olduğunu da aklınızda bulundurun.

XmlSerializer'ın saf bir teknik boyutu olsa da ("bu nesneyi XML'e nasıl dönüştürebilirim"), DataContract bir iş kavramının halka yönelik temsilidir.

Bu şekilde DataContract, sınıfınızda yaptığınız her değişikliğin tüketiciler üzerinde bir etkisi olacağını ve bu sözleşmeyle örtülü olarak bağlı olduğunuzu hatırlatır. Kavramsal olarak, DataContract hizmet mimarinizin merkezi bir öğesidir, XmlSerializer sadece bir yardımcıdır.


3
2018-01-25 11:21



Downvoter, açıklamaya dikkat et lütfen? - Johann Blais


XML türlerini XML'e serileştirmek için XmlSerializer ile ilgili önemli sorunlar

  • Yalnızca Public alanları veya .NET türlerinin Özellikleri XML'ye dönüştürülebilir
  • Sadece IEnumerable arayüzü uygulayan sınıflar
  • Hash tablosu gibi IDictionary arabirimini uygulayan sınıflar serileştirilemez DataContractSerializer ve XMLSerializer arasındaki önemli fark

DataContractSerializer'ın tasarımının pratik bir yararı, Xmlserializer üzerinde daha iyi bir performans.

  • XML Serileştirme, XML'de hangi alanların veya özelliklerin XML'ye serileştirildiğini belirtmez, DataCotractSerializer
  • Açık olarak hangi alanların veya özelliklerin XML'ye serileştirildiğini gösterir.
  • DataContractSerializer HashTable'ı XML'ye çevirebilir

2
2018-01-25 10:26





Sözdizimsel farklılıklardan ve küçük özelliklerden ayrı olarak, yaptığınız tek şey XML'den seri hale getirilip serileştirilecekse, karşılaştırmak için gerçek bir temel yoktur. Serializable üzerinden DataContract'ın en güçlü avantajı - herkesin atladığı bir şey - veri sözleşmeleri XML'e özgü değildir.

Veri sözleşmeleri ile çalışmak, sadece iki mantıksal yapı vardır: veri sözleşmeleri ve veri üyeleri (bir veri sözleşmesi üyeleri). Veri sözleşmesinde "ögeler" veya "xml öğeleri" diye bir şey yoktur.

Teorik olarak, veri sözleşmesine dayalı serileştirme, AFAIK sadece XML ve JSON serileştirme / serileştirme, şu anda .NET çerçevesinde mevcut olmasına rağmen, herhangi bir veri değişim formatında temsil edilecek bir nesne yapısını mümkün kılmaktadır. Bununla birlikte, RDF ile çalışmaktansa bir serileştirici yaratmak kesinlikle mümkündür ve orada ek serpizer var olduğundan şüpheleniyorum.

Aşağıdaki basit mimariyi düşünün:

C #

[DataContract]
class Company
{
    [DataMember]
    public string Name { get; set }

    [DataMember]
    public Person[] People { get; set }
}

[DataContract]
class Person
{
    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}

Bu sözleşme XML'ye özgü değildir. XML ile ilgili hiçbir şey belirtmediniz. Yukarıdaki mimarinin bir örneğini XML'ye serileştirebilirsiniz:

XML

<Company>
  <Name>...</Name>
  <People>
    <Person>
      <FirstName>James</FirstName>
      <LastName>Sunderland</LastName>
    </Person>
    ...
  </People>
</Company>

... ya da JSON’a:

JSON

{
    "Company": {
        "Name": "...",
        "People": [
            {
                "FirstName": "James",
                "LastName": "Sunderland"
            },
            ...
        ]
    }
}

... ya da bu format için bir serileştirici bulundurduğunuz sürece herhangi bir keyfi veri değişim formatına.

Özellikle çok sayıda müşteri ve akran tarafından tüketilen bir web servisiniz varsa veya web servisinizin tüketici grubu gelecekte genişlemeye maruz kalıyorsa, bu çok güçlü ve esnektir:

  • JSON'un JavaScript ve PHP sunucularında (veya herhangi bir dinamik dildeki) seri hale getirilmesi / serileştirilmesi daha kolaydır.
  • XML, WCF istemcilerine serileştirmek / serpiştirmek için daha basittir.

Kendinizi uygulama mimarinizdeki tek veri değişimi biçimi olarak XML ile sınırlamak istemiyorsanız, DataContract ile gitmenizi öneririm. Aksi takdirde, Serializable sadece XML için biraz daha yararlıdır.


2
2018-01-25 09:33





Bu soru oldukça eski olmasına rağmen benim anlayışımı özetleyeceğim:

1) Veri sözleşmesi, (DataMember) özniteliğini kullanarak belirli üyeleri veya alanları serileştirme esnekliği sağlar. 2) DataContract ile nesnelerinizin serileştirilme sırasına karar verebilirsiniz.

DataContract, kamu üyelerinizi serileştirirken, Serializable, mevcut alanlarınızı varsayılan olarak serileştirirken, açık olan şeylerin dışında.


1
2018-04-09 10:00