JSON dan XML menekankan interoperabilitas: teksnya dapat dibaca manusia dan mesin mana pun. Konsekuensinya ukuran payload membengkak. Ketika data hanya dikonsumsi oleh aplikasi .NET, format biner dengan BinaryWriter dan BinaryReader menyimpan tipe primitif dalam bentuk byte murni tanpa teks pengantar, sehingga hasilnya lebih ringkas dan cepat dibaca.
Pasangan Writer dan Reader #
BinaryWriter menulis tipe primitif ke Stream; string ditulis dengan awalan panjang (length-prefixed) agar reader mengetahui jumlah byte yang harus dibaca. Aturan utamanya satu: pembacaan harus menelusuri urutan tipe yang sama persis dengan penulisan.
Contoh Tulis dan Baca Kembali #
using var stream = new MemoryStream();
using (BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8, leaveOpen: true))
{
writer.Write(45000); // int, 4 byte
writer.Write("Kopi Gayo"); // string, 1 byte panjang + isi
writer.Write(0.85); // double, 8 byte
}
Console.WriteLine($"Panjang data: {stream.Length} byte");
stream.Position = 0;
using BinaryReader reader = new BinaryReader(stream, Encoding.UTF8);
Console.WriteLine(reader.ReadInt32());
Console.WriteLine(reader.ReadString());
Console.WriteLine(reader.ReadDouble());Output yang Dihasilkan:
Panjang data: 22 byte
45000
Kopi Gayo
0.85Mari kita bedah baris demi baris:
new BinaryWriter(stream, Encoding.UTF8, leaveOpen: true): writer menulis keMemoryStream; opsileaveOpenmenjaga stream tetap terbuka setelahusingwriter selesai, sehingga masih bisa dibaca ulang.- Tiga pemanggilan
Write:intmenempati 4 byte, string"Kopi Gayo"menempati 1 byte awalan panjang plus 9 byte isi UTF-8, dandoublemenempati 8 byte; totalnya 22 byte. stream.Position = 0: kursor stream dikembalikan ke awal; tanpa langkah ini, reader membaca dari akhir data dan gagal.- Tiga pemanggilan
Read: urutanReadInt32,ReadString,ReadDoublemencerminkan urutan penulisan, sehingga setiap nilai kembali utuh.