Seri hale getirici seçme

için BinaryFormatterbir açılan liste yoktur, ancak .NET türlerini serileştirmek için önerilen birkaç serileştirici vardır. Hangi seri hale getiriciyi seçerseniz seçin, yeni seri hale getiriciyle tümleştirme için değişiklikler gerekir. Bu geçişler sırasında, yeni seri hale getiriciyi mevcut türleri olabildiğince az değişiklikle işleyebilmesi için zorlamak ile seçilen seri hale getiriciyle uyumlu ve doğal bir serileştirmeyi mümkün kılacak şekilde türleri yeniden yapılandırma arasında denge kurmak önemlidir. Seri hale getirici seçildikten sonra, en iyi yöntemler için belgeleri incelenmelidir.

İkili serileştirme biçimi bir gereksinim değilse, JSON veya XML serileştirme biçimlerini kullanmayı düşünebilirsiniz. Bu serileştiriciler .NET'e dahildir ve resmi olarak desteklenir.

  1. System.Text.Json kullanarak JSON
  2. XML kullanarak System.Runtime.Serialization.DataContractSerializer

Senaryolarınız için sıkıştırılmış ikili gösterim önemliyse, aşağıdaki serileştirme biçimleri ve açık kaynak serileştiriciler önerilir:

  1. C için MessagePack kullanarak MessagePack#
  2. protobuf-net kullanan Protokol Arabellekleri

Seri hale getirilmiş türün API şeklini değiştirme denetiminizin olup olmadığı, serileştirmeye olan yönünüzü ve yaklaşımınızı etkiler. Bu seri hale getiricilere geçiş, türleri yeni özniteliklerle açıklama ekleme, yeni oluşturucular ekleme, türleri/üyeleri genel hale getirme ve alanları özelliklere değiştirme özelliğiyle daha kolay olabilir. Bu özellik olmadan, modern serileştiricilerin kullanılması özel dönüştürücülerin veya çözümleyicilerin uygulanmasını gerektirebilir.

Özellik BinaryFormatter System.Text.Json kütüphanesi DataContractSerializer C için MessagePack# protobuf-net
Serialization biçim ikili (NRBF) JSON veri formatı XML ikili (MessagePack) ikili (Protokol Arabellekleri)
Küçük gösterim ✔️ ✔️ ✔️
İnsan tarafından okunabilir ❌️ ✔️ ✔️ ❌️ ❌️
Performans ❌️ ✔️ ✔️ ✔️
[Serializable] öznitelik desteği ✔️ ✔️
Genel türleri seri hale getirme ✔️ ✔️ ✔️ ✔️ ✔️
Genel olmayan türleri serileştirme ✔️ ✔️ ✔️ ✔️ (çözümleyici gerekli) ✔️
Alanları seri hale getirme ✔️ ✔️ (kabul et) ✔️ ✔️ (öznitelik gerekli) ✔️ (öznitelik gerekli)
Ortak olmayan alanları seri hale getirme ✔️ ✔️ (çözümleyici gerekli) ✔️ ✔️ (çözümleyici gerekli) ✔️ (öznitelik gerekli)
Özellikleri serileştirme ✔️* ✔️ ✔️ ✔️ (öznitelik gerekli) ✔️ (öznitelik gerekli)
Salt okunur üyeleri seri durumdan çıkarma ✔️ ✔️ (öznitelik gerekli) ✔️ ✔️ ✔️ (parametresiz ctor gereklidir)
Çok biçimli tür hiyerarşisi ✔️ ✔️ (öznitelik gerekli) ✔️ ✔️ (öznitelik gerekli) ✔️ (öznitelik gerekli)
AOT desteği ❌️ ✔️ ✔️ ❌ (planlı)

System.Text.Json kullanarak JSON

Kitaplık System.Text.Json , JavaScript Nesne Gösterimi (JSON) biçimi için güvenlik, yüksek performans ve düşük bellek ayırmayı vurgulayan modern bir seri hale getiricidir. JSON, insan tarafından okunabilir ve geniş bir platformlar arası desteğe sahiptir. Metin tabanlı biçim, ikili biçimler kadar kompakt olmasa da, sıkıştırma yoluyla boyutu önemli ölçüde azaltılabilir.

Serialization özellikle öznitelikler ve oluşturucular aracılığıyla işlenmediği sürece genel olmayan ve salt okunur üyeleri dışlar. System.Text.Json ayrıca türlerin JSON'a nasıl dönüştürüldüğü üzerinde daha fazla denetim için özel serileştirme ve seri durumdan çıkarma destekler. System.Text.Json özniteliğini [Serializable] desteklemiyor.

System.Text.Json'a (JSON) geçiş.

DataContractSerializer kullanarak XML

DataContractSerializerWindows Communication Foundation (WCF) iletilerinde gönderilen verileri seri hale getirmek ve seri durumdan çıkarmak için kullanılır. DataContractSerializer, BinaryFormattertarafından kullanılan serileştirme programlama modelini tam olarak destekleyen bir XML seri hale getiricidir. Bu, [Serializable]ISerializable özniteliğini ve uygulamasını kabul ettiği anlamına gelir. Bu nedenle, geçiş için en az çaba gerektiren seri hale getiricidir. Ancak bilinen türlerin önceden belirtilmesi gerekir (ancak çoğu .NET koleksiyonu ve ilkel tür varsayılan izin verme listesindedir ve belirtilmesi gerekmez).

'den DataContractSerializergeçiş yaparken bu işlevsel avantajları taşırkenBinaryFormatter, diğer seçenekler kadar modern veya performanslı değildir.

DataContractSerializer'a (XML) geçiş.

Uyarı

ile DataContractSerializerkarıştırmayınNetDataContractSerializer. NetDataContractSerializer tehlikeli bir seri hale getirici olarak tanımlanır.

MessagePack kullanarak ikili

MessagePack, JSON ve XML ile karşılaştırıldığında daha küçük ileti boyutlarına neden olan kompakt bir ikili serileştirme biçimidir. C# kitaplığı için açık kaynak MessagePack yüksek performanslıdır ve daha da küçük bir veri boyutu için yerleşik süper hızlı LZ4 sıkıştırması sunar. Veri türlerine veya kitaplığın kendi öznitelikleriyle DataContractSerializer açıklama eklendiğinde en iyi şekilde çalışır. AOT ortamlarını, genel olmayan türleri ve üyeleri, salt okunur türleri ve üyeleri destekleyecek şekilde yapılandırılabilir.

MessagePack'e (ikili) geçiş.

protobuf-net kullanan ikili

protobuf-net kitaplığı, .NET için ikili Protokol Arabellekleri serileştirme biçimini kullanan sözleşme tabanlı bir seri hale getirme aracıdır. API tipik .NET desenlerini izler ve ile XmlSerializergeniş ölçüde karşılaştırılabilirDataContractSerializer. Bu popüler kitaplık da özellik açısından zengindir ve genel olmayan türleri ve alanları işleyebilir, ancak birçok senaryoda üyelere öznitelik uygulanması gerekir.

protobuf-net'e (ikili) geçiş.