Temui Bond, Microsoft Bond - Kerangka Serialisasi Data Baru

Diterbitkan: 2022-03-11

Microsoft Bond adalah kerangka kerja serialisasi baru untuk data skema yang dibuat oleh Microsoft.

Mari kita rekap di mana serialisasi data paling banyak digunakan:

  • Persistensi data dalam file, streaming, NoSQL, dan BigData.
  • Transmisi data dalam jaringan, IPC, dll.

Umumnya, aplikasi ini harus berurusan dengan data skema, di mana skema berarti:

  • Struktur: hierarki, relasi, keteraturan.
  • Semantik: umur dalam jumlah tahun sejak lahir.

kerangka kerja serialisasi data obligasi microsoft

Sebenarnya, data apa pun memiliki skema meskipun secara implisit didefinisikan atau didukung oleh bahasa pemrograman Anda di luar kotak. Ketika sampai pada struktur data yang kompleks, kami akhirnya menulis objek transfer data pendukung (DTO) dan kode yang bertanggung jawab untuk IO, seringkali dalam bahasa yang berbeda. Begitu tumbuh dan berkembang, dengan cepat menjadi mimpi buruk untuk mempertahankan semua bagian ini. Di sinilah kerangka serialisasi memenangkan permainan.

Pertama-tama, setiap kerangka serialisasi mendefinisikan abstraksi untuk definisi skema data yang tidak terikat pada bahasa pemrograman atau platform tertentu. Abstraksi ini dikenal sebagai DSL (domain-specific language).

Dengan DSL seperti itu, kita dapat mendefinisikan skema data untuk aplikasi tertentu. Definisi, pada gilirannya, dapat diekspresikan dalam berbagai bentuk, tetapi seringkali kerangka serialisasi mendukung satu bentuk yang cocok untuk DSL-nya. Terlalu rumit? Berikut adalah salah satu contoh terkenal: XSD dan XML.

XSD mendefinisikan DSL, XML (disarankan) untuk mendefinisikan dokumen yang cocok dengan skema XSD. Namun, Anda juga dapat menggunakan "xsd.exe" untuk menghasilkan kelas DTO yang cocok dengan XSD, oleh karena itu kelas yang dihasilkan hanyalah bentuk lain. Perhatikan bahwa Anda dapat menghasilkan XML dari DTO dan sebaliknya dan mereka akan identik secara semantik, karena semantiknya umum: itu didefinisikan dengan XSD. Untuk meringkas, kerangka serialisasi memberi Anda DSL, yang Anda gunakan untuk mendefinisikan skema data dalam format tertentu yang paling didukung oleh kerangka kerja yang diberikan.

Skema data abstrak pada akhirnya akan diwujudkan menjadi satu set entitas yang diekspresikan dalam bahasa pemrograman. Semua kerangka serialisasi menyediakan alat khusus yang disebut generator kode.

Mereka menghasilkan semua kode pendukung untuk bahasa pemrograman target, yang diperlukan klien untuk bekerja dengan data skema: DTO, proxy, dll. Ini pada akhirnya diperlukan untuk bahasa yang sangat diketik, sementara itu bisa opsional untuk bahasa yang diketik bebek (dinamis). .

Hal terakhir yang tidak kalah pentingnya adalah persistensi data pada kabel. Data aktual pada akhirnya akan diserialisasi menjadi byte mentah (atau teks) dan dideserialisasi kembali.

Semua kerangka serialisasi data menyediakan abstraksi lain di sini yang disebut protokol. Sebuah protokol mendefinisikan seperangkat aturan yang menentukan bagaimana data terstruktur harus diserialisasi atau dideserialisasi sesuai dengan skemanya. Setiap protokol biasanya diimplementasikan untuk semua bahasa pemrograman dan platform yang didukung oleh kerangka serialisasi yang diberikan. Semakin banyak bahasa/platform pemrograman yang didukungnya, semakin banyak implementasi yang akan diberikannya.

Bayangkan sebuah kerangka kerja bersedia mendukung protokol JSON, maka ia harus menyediakan pembaca/penulis JSON untuk mengatakan C#, C++, Windows, Linux, dll.

Menyatukan semuanya: kerangka serialisasi data modern memberi Anda hal berikut:

  • Abstraksi: DSL dan Protokol.
  • Alat pembuatan kode.
  • Implementasi protokol.

Microsoft Bond adalah kerangka kerja serialisasi data modern. Ini menyediakan DSL yang kuat dan protokol yang fleksibel, pembuat kode untuk C++ dan C#, implementasi protokol yang efisien untuk Windows, Linux, dan Mac OS X.

Selama beberapa tahun, Bond tetap menjadi teknologi penggunaan internal saja, tetapi berkat inisiatif Microsoft Open Source, Bond telah tersedia di GitHub: Microsoft Bond.

Pesaing Serialisasi Data

Persaingan di antara raksasa perangkat lunak menyebabkan sejumlah kerangka serialisasi muncul:

  • Google Inc. - Penyangga Protokol Google
  • Facebook Inc. - Hemat, yang sekarang dikelola oleh Apache
  • Perangkat Lunak Apache Foundation - Avro

Jelas, semuanya tidak kompatibel, yang tidak apa-apa kecuali Anda membuat API publik Anda menggunakan salah satunya.

Masing-masing memiliki kelebihan dan kekurangan, sehingga Anda dapat memilihnya berdasarkan kebutuhan Anda.

Mengapa Obligasi?

Jawaban resmi untuk pertanyaan ini ada di sini: "Mengapa Obligasi".

Berikut ringkasan singkatnya:

  • Bond mendukung sistem tipe kaya termasuk obat generik.
  • Bond mendukung pembuatan versi skema dan kompatibilitas dua arah.
  • Bond mendukung manipulasi skema runtime.
  • Obligasi mendukung berbagai koleksi: "vektor" , peta , Daftar ”.
  • Bond mendukung serialisasi malas tipe-aman: "berikat"
  • Bond mendukung protokol (format) yang dapat dicolokkan dengan marshaling dan transcoding

Catatan penting adalah bahwa Bond mengikuti strategi "bayar untuk bermain". Semakin banyak fitur yang Anda tambahkan/gunakan, semakin banyak Anda membayar untuk ukuran dan kecepatan. Ini memberi pengembang fleksibilitas yang besar.

Mari kita jujur ​​dan daftar kekurangannya juga:

  • Bond menargetkan Microsoft stack dengan mendukung C++ dan C#, tetapi belum mendukung Java (belum).
  • Obligasi tidak mendukung tipe serikat pekerja (“salah satu” dalam protobuf).

Bagaimana Dengan Performa?

Ketika membandingkan satu kerangka kerja dengan kerangka lainnya, pengembang sering mencari perbandingan kinerja. Tapi mari kita ingat bahwa kerangka kerja ini terdiri dari DSL, pembuat kode, dan protokol. Jika Anda mempertimbangkan kinerja protokol saja, maka Anda akan kehilangan fitur yang disediakan oleh DSL dan codegens. Terkadang, memiliki DSL yang lebih baik jauh lebih penting daripada memiliki beberapa persen perbedaan dalam kecepatan serialisasi.

Selain kecepatan, pengkodean hemat ruang yang didukung oleh beberapa protokol juga bisa menjadi penting. Saya mendorong Anda untuk melakukan perbandingan kinerja/ruang dengan data spesifik domain Anda. Ini adalah satu-satunya cara untuk memperkirakan semua manfaat yang bisa Anda dapatkan dari kerangka kerja tertentu.

obligasi microsoft

Artikel ini dilengkapi dengan proyek demo yang mendemonstrasikan penggunaan kerangka kerja Bond dengan membaca semua catatan dari Log Peristiwa Aplikasi Windows, membuat serialnya sebagai objek Obligasi dan menghapus serinya kembali.

Untuk membangun dan menjalankan demo, Anda tidak perlu menginstal perangkat lunak apa pun selain Visual Studio.

Menggunakan Microsoft Bond

Mendapatkan Obligasi

Lihat panduan resmi untuk mendapatkan Bond untuk platform Anda.

Untuk proyek .NET, ini sesederhana:

 install-package Bond.CSharp

Paket termasuk:

  • Generator kode (gbc.exe) di folder bin
  • .NET perpustakaan
  • Tugas MSBuild

alur kerja

Alur kerja mencakup langkah-langkah berikut:

  • Pelajari DSL dan tentukan skema data dengan menulis file “.bond”.
  • Gunakan pembuat kode (“gbc.exe”) untuk mendapatkan DTO untuk bahasa pemrograman Anda.
  • Referensi file yang dihasilkan serta perpustakaan runtime Bond di proyek Anda.

Pertimbangkan untuk menggunakan tugas MSBuild yang disediakan dengan kerangka kerja untuk mengotomatiskan langkah pembuatan kode.

Ikhtisar Fitur DSL

Saat Anda mulai menulis file ".bond" pertama Anda, Anda perlu mengetahui sintaks dan fitur-fiturnya. Silakan kunjungi halaman dokumentasi resmi yang menjelaskan IDL secara rinci. Mari kita tinjau fitur dasar saja:

  • Modul: skema dapat dipecah menjadi file yang berbeda, yang disertakan dengan pernyataan "impor".
  • Namespace: memiliki arti yang sama dengan yang dimiliki C++/C#.
  • struct yang ditentukan pengguna: unit definisi tipe pengguna.
  • Deklarasi maju berguna untuk struktur data rekursif.
  • Tipe dasar: "bool, uint8 (sampai 64), int8 (sampai 64), float, double, string, wstring".
  • Jenis wadah: “gumpalan, daftar , vektor , mengatur , peta<K, T>, dapat dibatalkan ”.
  • Alias ​​​​dan pemetaan yang diketik khusus, misalnya jika Anda ingin memiliki "DateTime" di C#, tetapi centang ("int64") di kabel.
  • Atribut khusus: berguna untuk pembuatan kode khusus.

Bosan? Berikut ini contohnya:

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

di mana “0” dan “1” adalah nomor urut bidang (dapat berupa bilangan bulat apa pun dengan kecepatan apa pun) dan = "Noname" adalah nilai default (opsional).

Pembuatan Kode

Kerangka kerja obligasi menyediakan alat pembuatan kode yang ditulis dalam Haskell. Berikut adalah cara menghasilkan kode C# dan C++ dari skema “.bond” di baris perintah:

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

Protokol yang Didukung (format)

Di luar kotak Bond mendukung tiga jenis protokol:

  • Protokol yang ditandai: “CompactBinary” dan “FastBinary”

Protokol yang diberi tag menyisipkan metadata skema dalam payload. Hal ini membuat payload menggambarkan dirinya sendiri, memungkinkan konsumen untuk menafsirkannya bahkan tanpa mengetahui skema yang digunakan oleh produsen.

  • Protokol yang tidak ditandai: "SimpleBinary"

Protokol yang tidak ditandai hanya membuat serial data, dan dengan demikian mengharuskan konsumen mengetahui skema payload melalui beberapa mekanisme out-of-band. Protokol yang tidak ditandai sering digunakan dalam skenario penyimpanan karena memungkinkan penyimpanan skema sekali (misalnya dalam tabel sistem dalam database), sehingga menghilangkan overhead metadata dari banyak catatan menggunakan skema yang sama.

  • Protokol berbasis DOM: "SimpleJson" dan "SimpleXml"

Protokol berbasis DOM mengurai seluruh muatan ke dalam Model Objek Data dalam memori yang kemudian ditanyakan selama deserialisasi. Biasanya, protokol semacam ini digunakan untuk mengimplementasikan pengkodean berbasis teks seperti JSON atau XML.

Untuk setiap protokol, perpustakaan runtime Bond memberi Anda kelas Pembaca dan Penulis yang sesuai, yang melakukan pekerjaan pada serialisasi yang sebenarnya.

Menggunakan protokol cukup mudah, dan sedikit lebih sulit daripada "JsonConvert.SerializeObject()" yang terkenal itu:

 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);

Apa berikutnya?

Jika Anda menyukai Bond, dan jika Anda memiliki banyak waktu luang untuk coding, pertimbangkan untuk mengembangkan salah satu item ini. Saya tidak akan menyebutkan semua manfaat yang mungkin Anda dapatkan dari berkontribusi, tetapi saya tahu banyak pengembang mencari ide untuk berkontribusi:

  • Menerapkan port ke Jawa. Ganti Java dengan bahasa utama lainnya sesuai pilihan Anda.
  • Menerapkan impor/ekspor skema Obligasi untuk ditukar dengan DSL lain (misalnya “.proto <=> .bond”).

Apa pun yang Anda putuskan untuk dilakukan terkait Bond, saya sarankan Anda menghubungi Adam Sapek terlebih dahulu. Dia adalah pemimpin proyek ini dan dia akan memandu Anda dengan apa yang paling dituntut oleh pasar.