JavaRush /Blog Java /Random-MS /Antara muka - penanda
dupliaka
Tahap
Санкт-Петербург

Antara muka - penanda

Diterbitkan dalam kumpulan
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"); } }

Merakam objek

Mula-mula, kami mencipta objek kelas boleh bersiri BigObject, kemudian kami menyediakan penimbal data untuknya - tempat kami akan meletakkan semua busur ByteArrayOutputStream. Kemudian kami menyediakan ObjectOutputStream yang telah disebutkan dan hantar penimbal kepadanya. Kami menulis objek kami ke aliran dan menutupnya.

Membaca objek

Mari sediakan penampan tulis readBuffer, lulus inputStream, baca readObject(). Objek itu kini telah dipulihkan. Terima kasih kepada fakta bahawa medan `id` bukan pautan, kami dapat menandakan kelas Serializable, yang mengandungi datanya sepenuhnya. Daripada menambah fungsi pengesahan di dalam kelas kami, token membolehkan kami memudahkan proses pengesahan kelas.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION