Medan dalam kelas Boleh Bersiri mestilah sama ada Boleh Bersiri atau sementara walaupun kelas itu tidak pernah bersiri atau dinyahsiri secara eksplisit. Ini kerana di bawah beban, kebanyakan rangka kerja aplikasi J2EE menyiram objek ke cakera dan objek yang dikatakan Boleh Bersiri dengan ahli data tidak sementara dan tidak boleh disiri boleh menyebabkan ranap program dan membuka pintu kepada penyerang.
Peraturan ini menimbulkan isu mengenai medan tidak boleh bersiri dan medan koleksi apabila ia bukan peribadi (kerana ia boleh diberikan nilai tidak boleh bersiri secara luaran), dan apabila ia diberikan jenis tidak boleh bersiri dalam kelas.
Contoh Kod Tidak Mematuhi
public class Address {
//...
}
public class Person implements Serializable {
private static final long serialVersionUID = 1905122041950251207L;
private String name;
private Address address; // Noncompliant; Address isn't serializable
}
Apabila objek disiri, mengikut peraturan penyirian lalai Java, semua ahli dalam objek mesti bersiri Maksudnya, Kelas ini mesti melaksanakan Serializable.
Jadi, anda mempunyai dua cara untuk mengubah suainya Satu ialah melaksanakan antara muka Boleh Bersiri dalam Alamat, dan satu lagi ialah menambah tanda
transient
pada ahli alamat secara Orang supaya ahli itu tidak bersiri.Jika ahli alamat perlu bersiri, kelas Alamat juga perlu melaksanakan antara muka Serializable.
Jika ahli alamat tidak perlu bersiri, anda boleh menambah kata kunci transient, maka ahli alamat tidak akan bersiri dan nilainya adalah batal. Seperti berikut:
Sudah tentu terdapat cara lain:
Sebagai contoh, melaksanakan antara muka Externalizable dan mengatasi kaedah readExternal(ObjectInput in) dan writeExternal(ObjectOutput out).
Terdapat juga pelaksanaan alternatif kaedah antara muka Externalizable, atau melaksanakan antara muka Serializable, menambah writeObject(ObjectOutputStream obs) dan readObject(ObjectInputStream ois).
Beritahu saya sekali lagi mengapa Alamat mesti melaksanakan Serializable, atau tambahkan kata kunci transient Orang untuk disirikan?
Mari kita lihat dahulu pengecualian yang dilemparkan dengan menggunakan ObjectOutputStream untuk mengekalkan objek tanpa memproses
Lihat ObjectOutputStreamKod sumber:
Dapat dilihat daripada ini bahawa jika jenis objek yang ditulis ialah String, Array, Enum, atau Serializable, ia boleh bersiri, jika tidak NotSerializableException akan dilemparkan. Dan apabila mensiri objek, bukan sahaja objek semasa itu sendiri akan bersiri, tetapi objek lain yang dirujuk oleh objek itu juga akan bersiri.