Bond ile Tanışın, Microsoft Bond - Yeni Bir Veri Serileştirme Çerçevesi

Yayınlanan: 2022-03-11

Microsoft Bond, Microsoft tarafından oluşturulan şemalaştırılmış veriler için yeni bir serileştirme çerçevesidir.

Veri serileştirmenin en çok nerede kullanıldığını özetleyelim:

  • Dosyalarda, akışlarda, NoSQL ve BigData'da veri kalıcılığı.
  • Ağlarda veri iletimi, IPC, vb.

Genellikle, bu uygulamalar şemalaştırılmış verilerle uğraşmak zorundadır, burada şema şu anlama gelir:

  • Yapı: hiyerarşi, ilişkiler, düzen.
  • Semantik: Doğduğundan beri geçen yıl sayısı olarak yaş.

microsoft bond veri serileştirme çerçevesi

Aslında, herhangi bir veri, kullanıma hazır programlama diliniz tarafından dolaylı olarak tanımlanmış veya desteklenmiş olsa bile, şemaya sahiptir. Karmaşık veri yapıları söz konusu olduğunda, genellikle farklı dillerde destekleyici veri aktarım nesneleri (DTO'lar) ve IO'dan sorumlu kodu yazıyoruz. Büyüyüp geliştikçe tüm bu parçaları korumak hızla bir kabusa dönüşüyor. Serileştirme çerçevelerinin oyunu kazandığı yer burasıdır.

Her şeyden önce, herhangi bir serileştirme çerçevesi, belirli bir programlama dili veya platformuna bağlı olmayan veri şeması tanımı için bir soyutlama tanımlar. Bu soyutlama, DSL (etki alanına özgü dil) olarak bilinir.

Böyle bir DSL'ye sahip olarak, belirli bir uygulama için veri şeması tanımlayabiliriz. Tanım, sırayla, birden çok biçimde ifade edilebilir, ancak genellikle serileştirme çerçeveleri, DSL'si için çok uygun olan tek bir biçimi destekler. Çok karışık? İşte iyi bilinen bir örnek: XSD ve XML.

XSD, bir DSL tanımlar, XML, XSD şemasıyla eşleşen belgeleri tanımlamak için (önerilir). Ancak, XSD ile eşleşen DTO sınıfları oluşturmak için “xsd.exe”yi de kullanabilirsiniz, dolayısıyla oluşturulan sınıflar sadece başka bir formdur. DTO'lardan XML oluşturabileceğinizi ve bunun tersini yapabileceğinizi ve semantik ortak olduğu için semantik olarak aynı olacaklarını unutmayın: XSD ile tanımlanır. Özetlemek gerekirse, bir serileştirme çerçevesi size, verilen çerçeve tarafından en iyi desteklenen belirli bir biçimde veri şemalarını tanımlamak için kullandığınız bir DSL sağlar.

Soyut veri şeması, sonunda bir programlama dilinde ifade edilen bir dizi varlık halinde somutlaştırılacaktır. Tüm serileştirme çerçeveleri, kod oluşturucular adı verilen özel araçlar sağlar.

İstemcilerin şemalaştırılmış verilerle çalışması için gerekli olan hedef programlama dilleri için tüm destekleyici kodları oluştururlar: DTO'lar, proxy, vb. Bu, kesin olarak yazılan diller için nihai olarak gereklidir, ancak ördek tipi (dinamik) diller için isteğe bağlı olabilir. .

Son fakat en az önemli olan konu, kablodaki veri kalıcılığıdır. Gerçek veriler sonunda ham baytlara (veya metne) seri hale getirilecek ve tekrar seri hale getirilecektir.

Tüm veri serileştirme çerçeveleri, burada protokol adı verilen başka bir soyutlama sağlar. Bir protokol, yapılandırılmış verilerin şemasına göre nasıl serileştirilmesi veya seri durumdan çıkarılması gerektiğini tanımlayan bir dizi kural tanımlar. Her protokol, normal olarak, verilen serileştirme çerçevesi tarafından desteklenen tüm programlama dilleri ve platformlar için uygulanır. Ne kadar çok programlama dili/platformu desteklerse, o kadar çok uygulama sağlayacaktır.

Bir çerçevenin JSON protokolünü desteklemeye istekli olduğunu hayal edin, o zaman örneğin C#, C++, Windows, Linux vb. için JSON okuyucu/yazıcı sağlaması gerekir.

Hepsini bir araya getirmek: herhangi bir modern veri serileştirme çerçevesi size aşağıdakileri sağlar:

  • Soyutlamalar: DSL ve Protokoller.
  • Kod oluşturma araçları.
  • Protokol uygulamaları.

Microsoft Bond, modern bir veri serileştirme çerçevesidir. Güçlü DSL ve esnek protokoller, C++ ve C# için kod oluşturucular, Windows, Linux ve Mac OS X için verimli protokol uygulamaları sağlar.

Birkaç yıl boyunca Bond, yalnızca şirket içinde kullanılan bir teknoloji olarak kaldı, ancak Microsoft Açık Kaynak girişimi sayesinde Bond, GitHub: Microsoft Bond'da kullanıma sunuldu.

Veri Serileştirme Rakipleri

Yazılım devleri arasındaki rekabet, bir dizi serileştirme çerçevesinin ortaya çıkmasına neden oldu:

  • Google Inc. - Google Protokol Tamponları
  • Facebook Inc. - Artık Apache tarafından sağlanan Thrift
  • Apache Temel Yazılımı - Avro

Açıkçası, hepsi uyumsuzdur, bu, genel API'nizi bunlardan birini kullanarak yapmadığınız sürece sorun değil.

Her birinin artıları ve eksileri vardır, böylece ihtiyaçlarınıza göre aralarından seçim yapabilirsiniz.

Neden Bond?

Bu sorunun resmi cevabı burada: “Neden Bond”.

İşte hızlı özet:

  • Bond, jenerikler dahil zengin tip sistemi destekler.
  • Bond, şema sürümü oluşturmayı ve iki yönlü uyumluluğu destekler.
  • Bond, çalışma zamanı şema manipülasyonunu destekler.
  • Bond çeşitli koleksiyonları destekler: “vektör , harita , liste ”.
  • Bond, tür güvenli tembel serileştirmeyi destekler: "bağlı
  • Bond, sıralama ve kod dönüştürme ile tak-çıkar protokolleri (formatları) destekler

Önemli bir not, Bond'un “oynamak için öde” stratejisini izlemesidir. Ne kadar çok özellik eklerseniz/kullanırsanız, boyut ve hız için o kadar fazla ödeme yaparsınız. Bu, geliştiricilere büyük esneklik sağlar.

Dürüst olalım ve dezavantajları da sıralayalım:

  • Bond, C++ ve C# destekli Microsoft yığınını hedefliyor, ancak Java'yı desteklemiyor (henüz).
  • Bond, birleşim türünü desteklemez (protobuf'ta "oneof").

Peki ya Performans?

Bir çerçeveyi diğeriyle karşılaştırmak söz konusu olduğunda, geliştiriciler genellikle performans karşılaştırmaları ararlar. Ancak bu çerçevelerin DSL, kod üreteçleri ve protokollerden oluştuğunu hatırlayalım. Yalnızca protokollerin performansını düşünürseniz, DSL ve codegens tarafından sağlanan özellikleri kaçıracaksınız. Bazen, daha iyi DSL'ye sahip olmak, serileştirme hızında yüzde birkaç farka sahip olmaktan çok daha önemlidir.

Hız dışında, bazı protokoller tarafından desteklenen alan açısından verimli kodlamalar da önemli olabilir. Alanınıza özel verilerinizle bir performans/alan karşılaştırması yapmanızı tavsiye ederim. Belirli bir çerçeveden elde edebileceğiniz tüm faydaları tahmin etmenin tek yolu budur.

microsoft bağı

Bu makale, Windows Uygulama Olay Günlüğü'ndeki tüm kayıtları okuyarak, bunları Bond nesneleri olarak serileştirerek ve tekrar seri durumdan çıkararak Bond çerçevesi kullanımını gösteren demo projesiyle birlikte gelir.

Demoyu oluşturmak ve çalıştırmak için Visual Studio dışında herhangi bir yazılım yüklemeniz gerekmez.

Microsoft Bond'u Kullanma

Bond almak

Platformlarınız için Bond almayla ilgili resmi kılavuza bakın.

.NET projeleri için bu kadar basittir:

 install-package Bond.CSharp

Paket şunları içerir:

  • Bin klasöründe kod oluşturucu (gbc.exe)
  • .NET kitaplıkları
  • MSBuild görevleri

iş akışı

İş akışı aşağıdaki adımları içerir:

  • DSL'yi öğrenin ve “.bond” dosya(lar)ını yazarak veri şemasını tanımlayın.
  • Programlama diliniz için DTO'lar almak için kod oluşturucuyu ("gbc.exe") kullanın.
  • Projenizde oluşturulan dosyalara ve Bond çalışma zamanı kitaplıklarına başvurun.

Kod oluşturma adımını otomatikleştirmek için çerçeveyle sağlanan MSBuild görevlerini kullanmayı düşünün.

DSL Özelliklerine Genel Bakış

İlk “.bond” dosyanızı yazmaya başladığınızda, söz dizimini ve özelliklerini bilmeniz gerekecek. Lütfen IDL'yi ayrıntılı olarak açıklayan resmi belgeler sayfasını ziyaret edin. Sadece temel özellikleri gözden geçirelim:

  • Modüller: şema, “import” ifadesine dahil edilen farklı dosyalara bölünebilir.
  • Ad alanı: C++/C# ile aynı anlama sahiptir.
  • Kullanıcı tanımlı yapılar: bir kullanıcı tipi tanımı birimi.
  • İleri bildirim, özyinelemeli veri yapıları için kullanışlıdır.
  • Temel türler: “bool, uint8(-64), int8(-64), float, double, string, wstring”.
  • Kapsayıcı türleri: “blob, liste , vektör , Ayarlamak , map<K, T>, null yapılabilir ”.
  • Özel yazılan takma adlar ve eşleme, örneğin C#'da "DateTime" olmasını istiyorsanız, ancak kabloda işaretler ("int64").
  • Özel nitelikler: özel kod üretimi için kullanışlıdır.

Canı sıkkın? İşte bir örnek:

 namespace MyProject struct MyRecord { 0: string Name = "Noname"; 1: vector<double> Constants; }

burada "0" ve "1" alan sıra sayılarıdır (herhangi bir hızda herhangi bir tam sayı olabilir) ve = "Noname" (isteğe bağlı) varsayılan değerdir.

Kod Oluşturma

Bond çerçevesi, Haskell'de yazılmış kod oluşturma aracı sağlar. Komut satırında bir “.bond” şemasından C# ve C++ kodunun nasıl oluşturulacağı aşağıda açıklanmıştır:

 gbc c# example.bond gbc c++ example.bond

Desteklenen Protokoller (formatlar)

Kutunun dışında Bond üç tür protokolü destekler:

  • Etiketli protokoller: “CompactBinary” ve “FastBinary”

Etiketli protokoller, yük içindeki şema meta verilerini serpiştirir. Bu, yükün kendi kendini tanımlamasını sağlar ve tüketicilerin üretici tarafından kullanılan şemayı bilmeden bile yorumlamasını sağlar.

  • Etiketlenmemiş protokoller: "SimpleBinary"

Etiketlenmemiş protokoller yalnızca verileri serileştirir ve bu nedenle tüketicilerin bazı bant dışı mekanizmalar aracılığıyla yük şemasını bilmesini gerektirir. Etiketlenmemiş protokoller genellikle depolama senaryolarında kullanılır, çünkü bir şemayı bir kez depolamaya izin verirler (örneğin bir veritabanındaki bir sistem tablosunda), böylece aynı şemayı kullanan birçok kayıttan üst veri yükünü ortadan kaldırır.

  • DOM tabanlı protokoller: “SimpleJson” ve “SimpleXml”

DOM tabanlı protokol, tüm yükü, daha sonra seri durumdan çıkarma sırasında sorgulanan bir bellek içi Veri Nesnesi Modeline ayrıştırır. Tipik olarak, bu tür bir protokol, JSON veya XML gibi metin tabanlı kodlamaları uygulamak için kullanılır.

Bond çalışma zamanı kitaplığı, her protokol için size gerçek serileştirmede işi yapan karşılık gelen Reader ve Writer sınıflarını sağlar.

Protokolleri kullanmak oldukça basittir ve şu ünlü “JsonConvert.SerializeObject()”den biraz daha zordur:

 var record = new MyRecord { Name = "FooBar", Constants = { 3.14, 6.28 } }; var output = new OutputBuffer(); var writer = new CompactBinaryWriter<OutputBuffer>(output); Serialize.To(writer, record); var input = new InputBuffer(output.Data); var reader = new CompactBinaryReader<InputBuffer>(input); record = Deserialize<Example>.From(reader);

Sıradaki ne?

Bond'u seviyorsanız ve kodlama için bolca boş zamanınız varsa, bu öğelerden birini geliştirmeyi düşünün. Katkıda bulunmaktan elde edebileceğiniz tüm faydaları saymayacağım, ancak birçok geliştiricinin katkıda bulunmak için fikirler aradığını biliyorum:

  • Java'ya bir bağlantı noktası uygulayın. Java'yı tercih ettiğiniz diğer ana dillerle değiştirin.
  • Diğer DSL'lerle (örneğin “.proto <=> .bond”) alışveriş yapmak için Bond şeması içe/dışa aktarın.

Bond ile ilgili ne yapmaya karar verirseniz verin, önce Adam Sapek ile iletişime geçmenizi tavsiye ederim. Bu projenin lideridir ve pazarın en çok talep ettiği şeyler konusunda size rehberlik edecektir.