46

arasındaki farklar nelerdir? Serileştirme üzerinde çalışırken geçen hafta iyi bir zaman harcadım. Bu süre boyunca, BinaryFormatter veya XmlSerializer'ı kullanan birçok örnek buldum. Ne yazık ki, bulamadığım şey, ikisi arasındaki farkları kapsamlı bir şekilde detaylandıran örneklerdi.XmlSerializer ve BinaryFormatter

Merakımın özü, BinaryFormatter'ın XmlSerializer olmasa bile bir arabirime doğrudan neden dönüş yapabildiğidir. "casting to multiple (unknown types) at runtime" 'a verilen bir yanıt olarak Jon Skeet, bir arabirime doğrudan ikili seri hale getirme için bir örnek sağlar. Stan R. bana "XML Object Deserialization to Interface" cevabında XmlSerializer kullanarak amacımı gerçekleştirme aracı sağladı.

BinaryFormatter'in aşikar olmasının ötesinde, XmlSerializer XML kullanıyorken ikili serileştirmeyi kullanır. Temel farklılıkları daha iyi anlamak isterim. Bir veya diğerini ne zaman kullanacaksınız?

cevap

87

bir ikili biçimlendirici bir arayüz tipi doğrudan serisini mümkün olduğu nedenidir. Bu, ikili biçimlendiricinin nesneyi türünü türettiğinde, doğru nesneyi oluşturduğu ve bunu nesnenin uyguladığı bir arabirim türüne atayabildiğiniz anlamına gelir.

otherhand XML serileştirici sadece bir şemaya serializes ve ancak o zaman o diğer kamu alanları ve nesnenin değerlerini ve hiçbir tür bilgileri (örneğin tip uygular arayüzlük) serializes.İşte

BinaryFormatter, SoapFormatter ve XmlSerializer karşılaştıran iyi bir post, .NET Serialization vardır. Önceden belirtilen serileştiricilere ek olarak DataContractSerializer, NetDataContractSerializer ve protobuf-net'u da içeren aşağıdaki tabloya bakmanızı öneririz.

Serialization Comparison

+1

İyi bir masa. Ben her zaman jenerik rahatsızlık veren SOAP eksikliği buldum. –

+1

@ahsteele - Benim "en iyi performans" sınıflandırma yanlış olduğuna inanıyoruz bir yıldız –

+5

vardır. İkili biçimlendirici, .net (belki de sabun biçimlendirici hariç) içinde en kötü performans gösteren dizindir. http://blogs.msdn.com/b/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx, http: // james En azından çoğu kriterler gösteriyor zaten. newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx, http://techmikael.blogspot.com/2010/01/net-serialization-performance.html – joniba

1

XmlSerializer, türü hem genel alıcıya hem de herkese açık ayarlayıcıya (ve ayrıca herkese açık alanlara) sahip tüm türlerin özelliklerini okuyarak seri hale getirir. Bu anlamda XmlSerializer, örneğin "genel görünümünü" serileştirir/kaldırır. Buna karşılık, ikili biçimlendirici, örneğin, "dahili" yani, onun alanlarını serileştirerek bir türü serileştirir. [NonSerialized] olarak işaretlenmemiş alanlar, ikili akışa serileştirilir. Türün kendisi de serileştirilecek olan herhangi bir dahili alanın olması gerektiği gibi [Seri hale getirilebilir] olarak işaretlenmelidir.

2

XML Serializer, XML ve XML Şeması (dolaylı olarak) üretir. Bu şemaya uygun XML üretecektir. Bir örnek, XML Şemasında açıklanamayan hiçbir şeyi serileştirmeyecek olmasıdır. Örneğin, XML Şeması'ndaki bir liste ile bir dizi arasında ayrım yapmanın bir yolu yoktur, bu nedenle, diziselleştirici tarafından üretilen XML Şeması, iki şekilde de yorumlanabilir.

Çalışma zamanı serileştirmesi (BinaryFormatter'un bir parçasıdır), diğer .NET türlerini diğer tarafa serileştirir, böylece bir List<int> gönderirseniz, diğer taraf bir List<int> alır. diğer taraf .NET çalışıyorsa tabii ki daha iyi çalışır

. Ben en önemli olanlardan biri sanırım

+0

Merhaba John, bir Liste 'un işlenmesinin bir sorun olmadığını merak ediyordum, yine de BinaryFormatter'ı tercih edermisiniz? – paradisonoir

+0

Hayır. Liste sadece bir örnekti. İki tamamen farklı kullanım durumları var. BTW, SoapFormatter'a bakın.Süre seri (iki biçemleyicileri) Veri Sözleşme serileştirme çok farklıdır XML Serialization, tamamen farklıdır. –

0

diğeri kamu olanlarla çalışır oysa ikili seri, hem kamu hem özel üye serileştirebilirsiniz olmasıdır.

burada, bu boyutu açısından bu ikisi arasında bir çok yararlı bir karşılaştırmasını sağlar. Bu çok önemli bir sorundur çünkü seri hale getirilmiş nesneyi uzak bir makineye gönderebilirsiniz. Bir nesne tipi ve montaj bilgilerini içeren bir ikili akış meta başlangıçta seri olduğunda, nesnenin verileri ile sıkışmış çünkü

http://www.nablasoft.com/alkampfer/index.php/2008/10/31/binary-versus-xml-serialization-size/

6
ikisi arasında belirgin fark "xml vs ikili" dir

Hemen tartmak ... ama bundan çok daha derine inelim yapar:

  • alanları sözleşme-ba vs halka üye (tipik özellikleri) (XmlSerializer = xs)
  • tip meta göre (bf) karşı (BinaryFormatter = bf) sed versiyonu-toleranslı karşı (xs)
  • versiyonu kırılgan (bf) (xs)
  • taşınabilir (xs) yerine "grafiği" "tree" v (bf) (xs)
  • NET spesifik (bf) insan tarafından okunabilir (xs) vs
  • opak (bf) BinaryFormatter, see here kırılgan olabilir neden bir tartışma olarak

. Daha büyük olanı tartışmak imkansızdır; BinaryFormatter'daki tüm tip meta veriler, daha büyük hale getirebilir. Ve XmlSerializer gzip gibi sıkıştırma ile çok çalışabilir. Bununla birlikte, her birinin gücünü almak mümkündür; Örneğin, Google kendi veri serileştirme formatını, "protokol arabelleklerini" açık kaynaklı hale getirmiştir. Şu şekilde:

  • sözleşmeye dayalı
  • taşınabilir (bkz list of implementations)
  • versiyonu dayanıklı
  • ağaç bazlı
  • verileri göstermek için araçlar olmasına rağmen
  • opak (a .proto birleştirildiğinde
  • genellikle "contract first", ancak bazı uygulamalar yansımalara dayalı örtülü sözleşmelere izin verir

Ama daha önemlisi, çok yoğun bir veri (tip metadata yok, saf ikili gösterim, kısa etiketler, varyant uzunluklu base-7 kodlaması gibi püf noktaları) ve işlem yapmak çok verimli (karmaşık xml yapısı yok, eşleşecek dizge yok) üyeler, vb.

Biraz önyargılı olabilirim; Uygulamalardan birini koruyorum (C#/NET için birkaç tane de dahil olmak üzere), ancak herhangi bir özel uygulamasına bağlanmadığımı not edersiniz; format, kendi değerlerinin altında kalıyor; -p

İlgili konular