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 #

csharp
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:

text
Panjang data: 22 byte
45000
Kopi Gayo
0.85

Mari kita bedah baris demi baris:

  1. new BinaryWriter(stream, Encoding.UTF8, leaveOpen: true): writer menulis ke MemoryStream; opsi leaveOpen menjaga stream tetap terbuka setelah using writer selesai, sehingga masih bisa dibaca ulang.
  2. Tiga pemanggilan Write: int menempati 4 byte, string "Kopi Gayo" menempati 1 byte awalan panjang plus 9 byte isi UTF-8, dan double menempati 8 byte; totalnya 22 byte.
  3. stream.Position = 0: kursor stream dikembalikan ke awal; tanpa langkah ini, reader membaca dari akhir data dan gagal.
  4. Tiga pemanggilan Read: urutan ReadInt32, ReadString, ReadDouble mencerminkan urutan penulisan, sehingga setiap nilai kembali utuh.