Bagikan melalui


ISerializable Antarmuka

Definisi

Serialisasi kelas diaktifkan oleh kelas yang mengimplementasikan java.

[Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")]
public interface ISerializable : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")>]
type ISerializable = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
Turunan
Atribut
Penerapan

Keterangan

Serialisasi kelas diaktifkan oleh kelas yang mengimplementasikan antarmuka java.io.Serializable.

<Peringatan kuat>: Deserialisasi data yang tidak tepercaya secara inheren berbahaya dan harus dihindari. Data yang tidak tepercaya harus divalidasi dengan hati-hati. </strong>

Kelas yang tidak menerapkan antarmuka ini tidak akan memiliki status yang diserialisasikan atau dideserialisasi. Semua subjenis kelas yang dapat diserialisasikan sendiri dapat diserialisasikan. Antarmuka serialisasi tidak memiliki metode atau bidang dan hanya berfungsi untuk mengidentifikasi semantik yang dapat diserialisasikan.

Untuk memungkinkan subjenis kelas yang tidak dapat diserialisasikan, subjenis dapat bertanggung jawab untuk menyimpan dan memulihkan status bidang paket publik, terlindungi, dan (jika dapat diakses). Subjenis dapat mengasumsikan tanggung jawab ini hanya jika kelas yang diperluasnya memiliki konstruktor no-arg yang dapat diakses untuk menginisialisasi status kelas. Ini adalah kesalahan untuk mendeklarasikan kelas Serializable jika ini tidak terjadi. Kesalahan akan terdeteksi saat runtime.

Selama deserialisasi, bidang kelas yang tidak dapat diserialisasikan akan diinisialisasi menggunakan konstruktor publik atau no-arg yang dilindungi dari kelas . Konstruktor tanpa arg harus dapat diakses oleh subkelas yang dapat diserialisasikan. Bidang subkelas yang dapat diserialisasikan akan dipulihkan dari aliran.

Saat melintasi grafik, objek mungkin ditemukan yang tidak mendukung antarmuka Serializable. Dalam hal ini NotSerializableException akan dilemparkan dan akan mengidentifikasi kelas objek yang tidak dapat diserialisasikan.

Kelas yang memerlukan penanganan khusus selama proses serialisasi dan deserialisasi harus menerapkan metode khusus dengan tanda tangan yang tepat ini:

private void writeObject(java.io.ObjectOutputStream out)
                throws IOException
            private void readObject(java.io.ObjectInputStream in)
                throws IOException, ClassNotFoundException;
            private void readObjectNoData()
                throws ObjectStreamException;

Metode writeObject bertanggung jawab untuk menulis status objek untuk kelas tertentu sehingga metode readObject yang sesuai dapat memulihkannya. Mekanisme default untuk menyimpan bidang Objek dapat dipanggil dengan memanggil out.defaultWriteObject. Metode ini tidak perlu menyangkut dirinya sendiri dengan status milik superkelas atau subkelasnya. Status disimpan dengan menulis bidang individual ke ObjectOutputStream menggunakan metode writeObject atau dengan menggunakan metode untuk jenis data primitif yang didukung oleh DataOutput.

Metode readObject bertanggung jawab untuk membaca dari aliran dan memulihkan bidang kelas. Ini dapat memanggil in.defaultReadObject untuk memanggil mekanisme default untuk memulihkan bidang non-statis dan non-sementara objek. Metode defaultReadObject menggunakan informasi dalam aliran untuk menetapkan bidang objek yang disimpan dalam aliran dengan bidang bernama yang sesuai di objek saat ini. Ini menangani kasus ketika kelas telah berkembang untuk menambahkan bidang baru. Metode ini tidak perlu menyangkut dirinya sendiri dengan status milik superkelas atau subkelasnya. Status dipulihkan dengan membaca data dari ObjectInputStream untuk bidang individual dan membuat penugasan ke bidang objek yang sesuai. Membaca jenis data primitif didukung oleh DataInput.

Metode readObjectNoData bertanggung jawab untuk menginisialisasi status objek untuk kelas khususnya jika aliran serialisasi tidak mencantumkan kelas yang diberikan sebagai superkelas objek yang dideserialisasi. Ini dapat terjadi dalam kasus di mana pihak penerima menggunakan versi yang berbeda dari kelas instans yang dideserialisasi daripada pihak pengirim, dan versi penerima memperluas kelas yang tidak diperluas oleh versi pengirim. Ini juga dapat terjadi jika aliran serialisasi telah dirusak; oleh karena itu, readObjectNoData berguna untuk menginisialisasi objek deserialisasi dengan benar meskipun "bermusuhan" atau aliran sumber yang tidak lengkap.

Kelas yang dapat diserialisasikan yang perlu menunjuk objek alternatif untuk digunakan saat menulis objek ke aliran harus menerapkan metode khusus ini dengan tanda tangan yang tepat:

ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;

Metode writeReplace ini dipanggil oleh serialisasi jika metode ada dan akan dapat diakses dari metode yang ditentukan dalam kelas objek yang sedang diserialisasikan. Dengan demikian, metode ini dapat memiliki akses privat, dilindungi, dan paket-privat. Akses subkelas ke metode ini mengikuti aturan aksesibilitas java.

Kelas yang perlu menunjuk penggantian ketika instans dibaca dari aliran harus menerapkan metode khusus ini dengan tanda tangan yang tepat.

ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;

Metode readResolve ini mengikuti aturan pemanggilan dan aturan aksesibilitas yang sama dengan writeReplace.

Runtime serialisasi terkait dengan setiap kelas yang dapat diserialisasikan nomor versi, yang disebut serialVersionUID, yang digunakan selama deserialisasi untuk memverifikasi bahwa pengirim dan penerima objek berseri telah memuat kelas untuk objek yang kompatibel sehubungan dengan serialisasi. Jika penerima telah memuat kelas untuk objek yang memiliki serialVersionUID yang berbeda dari kelas pengirim yang sesuai, deserialisasi akan menghasilkan InvalidClassException. Kelas yang dapat diserialisasikan dapat mendeklarasikan serialVersionUID sendiri secara eksplisit dengan mendeklarasikan bidang bernama "serialVersionUID" yang harus statis, final, dan dari jenis long:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

Jika kelas yang dapat diserialisasikan tidak secara eksplisit mendeklarasikan serialVersionUID, maka runtime serialisasi akan menghitung nilai serialVersionUID default untuk kelas tersebut berdasarkan berbagai aspek kelas, seperti yang dijelaskan dalam Spesifikasi Serialisasi Objek Java (TM). Namun, <sangat>disarankan</em> bahwa semua kelas yang dapat diserialisasikan secara eksplisit menyatakan nilai serialVersionUID, karena komputasi serialVersionUID default sangat sensitif terhadap detail kelas yang dapat bervariasi tergantung pada implementasi kompilator, dan dengan demikian dapat mengakibatkan deserialisasi yang tidak terduga InvalidClassException. Oleh karena itu, untuk menjamin nilai serialVersionUID yang konsisten di berbagai implementasi kompilator java, kelas yang dapat diserialisasikan harus mendeklarasikan nilai serialVersionUID eksplisit. Juga sangat disarankan bahwa deklarasi serialVersionUID eksplisit menggunakan private pengubah jika memungkinkan, karena deklarasi tersebut hanya berlaku untuk bidang class-serialVersionUID yang segera mendeklarasikan tidak berguna sebagai anggota yang diwariskan. Kelas array tidak dapat mendeklarasikan serial eksplisitVersionUID, sehingga mereka selalu memiliki nilai komputasi default, tetapi persyaratan untuk mencocokkan nilai serialVersionUID dibebaskan untuk kelas array.

Implementasi Android dari komputasi serialVersionUID akan sedikit berubah untuk beberapa kelas jika Anda menargetkan android N. Untuk mempertahankan kompatibilitas, perubahan ini hanya diaktifkan adalah versi SDK target aplikasi diatur ke 24 atau lebih tinggi. Sangat disarankan untuk menggunakan bidang serialVersionUID eksplisit untuk menghindari masalah kompatibilitas.

<h3>Menerapkan Serializable Judiciously</h3> Mengacu pada bab Effective Java tentang serialisasi untuk cakupan menyeluruh dari API serialisasi. Buku ini menjelaskan cara menggunakan antarmuka ini tanpa membahayakan kelestarian aplikasi Anda.

<h3>Alternatif yang Direkomendasikan/h3<>JSON< kuat>/kuat> ringkas<, mudah dibaca manusia, dan efisien. Android menyertakan JSON android.util.JsonReader streaming API dan org.json.JSONObject tree API untuk membaca dan menulis. Gunakan pustaka pengikatan seperti GSON untuk membaca dan menulis objek Java secara langsung.

Ditambahkan dalam 1.1.

Dokumentasi Java untuk java.io.Serializable.

Bagian halaman ini adalah modifikasi berdasarkan pekerjaan yang dibuat dan dibagikan oleh Proyek Sumber Terbuka Android dan digunakan sesuai dengan istilah yang dijelaskan dalam Lisensi Atribusi Creative Commons 2.5.

Properti

Handle

Mendapatkan nilai JNI dari objek Android yang mendasar.

(Diperoleh dari IJavaObject)
JniIdentityHashCode

Mengembalikan nilai java.lang.System.identityHashCode() untuk instans yang dibungkus.

(Diperoleh dari IJavaPeerable)
JniManagedPeerState

Status serekan terkelola.

(Diperoleh dari IJavaPeerable)
JniPeerMembers

Akses anggota dan dukungan pemanggilan.

(Diperoleh dari IJavaPeerable)
PeerReference

Mengembalikan instans objek Java yang dibungkus JniObjectReference .

(Diperoleh dari IJavaPeerable)

Metode

Disposed()

Dipanggil ketika instans telah dibuang.

(Diperoleh dari IJavaPeerable)
DisposeUnlessReferenced()

Jika tidak ada referensi yang luar biasa untuk instans ini, maka panggilan Dispose(); jika tidak, tidak melakukan apa pun.

(Diperoleh dari IJavaPeerable)
Finalized()

Dipanggil ketika instans telah diselesaikan.

(Diperoleh dari IJavaPeerable)
SetJniIdentityHashCode(Int32)

Atur nilai yang dikembalikan oleh JniIdentityHashCode.

(Diperoleh dari IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Serialisasi kelas diaktifkan oleh kelas yang mengimplementasikan java.

(Diperoleh dari IJavaPeerable)
SetPeerReference(JniObjectReference)

Atur nilai yang dikembalikan oleh PeerReference.

(Diperoleh dari IJavaPeerable)
UnregisterFromRuntime()

Batalkan pendaftaran instans ini sehingga runtime tidak akan mengembalikannya dari pemanggilan di masa mendatang Java.Interop.JniRuntime+JniValueManager.PeekValue .

(Diperoleh dari IJavaPeerable)

Metode Ekstensi

JavaCast<TResult>(IJavaObject)

Melakukan konversi jenis yang diperiksa runtime Bahasa Umum Android.

JavaCast<TResult>(IJavaObject)

Serialisasi kelas diaktifkan oleh kelas yang mengimplementasikan java.

GetJniTypeName(IJavaPeerable)

Serialisasi kelas diaktifkan oleh kelas yang mengimplementasikan java.

Berlaku untuk