import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

public class BedahStream {

    static class Pesan implements Serializable {
        private static final long serialVersionUID = 42L;
        private final String isi;

        Pesan(String isi) {
            this.isi = isi;
        }
    }

    public static void main(String[] args) throws IOException {
        var penampung = new ByteArrayOutputStream();
        try (var keluar = new ObjectOutputStream(penampung)) {
            keluar.writeObject(new Pesan("halo"));
        }
        byte[] data = penampung.toByteArray();
        System.out.println("panjang stream : " + data.length + " byte");

        var hex = new StringBuilder();
        for (int i = 0; i < data.length && i < 20; i++) {
            hex.append(String.format("%02X ", data[i]));
        }
        System.out.println("20 byte pertama: " + hex.toString().trim());

        // Tata letak: [0-3] header, [4] penanda objek, [5] penanda class,
        // [6-7] panjang nama, lalu nama class, lalu 8 byte serialVersionUID.
        int panjangNama = ((data[6] & 0xFF) << 8) | (data[7] & 0xFF);
        String namaClass = new String(data, 8, panjangNama, StandardCharsets.UTF_8);
        System.out.println("nama class     : " + namaClass);

        long uid = ByteBuffer.wrap(data, 8 + panjangNama, 8).getLong();
        System.out.println("serialVersionUID: " + uid);
    }
}
