Antara muka penanda ialah corak reka bentuk dengan pemeriksaan jenis masa jalan yang membolehkan anda mengaitkan antara muka dan kelas. Untuk memahami mengapa ini mungkin perlu, pertimbangkan contoh menandakan kelas Serializible dengan penanda. Mari kita anggap bahawa kita perlu menyimpan keadaan objek dalam ingatan, dan kemudian juga boleh menyahsulit perkara yang kita simpan. Kemudian, anda katakan, kita boleh menukar objek kita kepada satu set bit. Betul. Kita boleh menggunakan cara mudah menulis ke fail menggunakan FileInputStream, tetapi ini hanya mudah jika terdapat sedikit objek, tetapi bagaimana jika terdapat banyak daripada mereka? Terdapat alat bersiri yang menarik untuk ini. Peraturan utama apabila anda menggunakannya ialah objek yang disiri mesti mengandungi semua data dan tidak merujuk kepada objek lain. Lihat kelas anda "Aha, medan tidak dirujuk dan adalah baik untuk meletakkan penanda Boleh Bersiri." Dan apabila anda meletakkannya, ini bermakna objek yang anda tandakan boleh ditulis ke ObjectOutputStream. Kelas ObjectOutputStream mempunyai kaedah writeObject0(), dan ia mengandungi instanceof semakan yang menyemak sama ada objek boleh ditulis dan jika keseluruhan siri semakan gagal, maka pengecualian NotSerializableException dilemparkan, dan jika tidak, semuanya ditulis dengan kemas ke ingatan. Mari kita buat kelas BigObject, contoh yang akan kita sirikan.
package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } }
Kelas BigObject sudah ditandakan sebagai Serializable. Ia mempunyai satu medan id dan kaedah get/set yang disertakan. package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(); ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer); outputStream.writeObject(objectOriginal); outputStream.close(); byte[] buffer = writeBuffer.toByteArray(); ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer); ObjectInputStream inputStream = new ObjectInputStream(readBuffer); BigObject objectCopy = (BigObject)inputStream.readObject(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }
GO TO FULL VERSION