JavaRush /Blog Jawa /Random-JV /Apa sing didhelikake modifier transient ing Jawa?
Анзор Кармов
tingkat
Санкт-Петербург

Apa sing didhelikake modifier transient ing Jawa?

Diterbitake ing grup
Hello! Ing artikel dina iki, kita bakal ndeleng modifier transient ing basa Jawa. Ayo dadi pirembagan bab apa modifikasi iki dibutuhake lan carane nggunakake bener. Tindak! Apa sing didhelikake modifier transient ing Jawa - 1

Ayo ngelingi serialisasi

Modifier transientdigunakake ing proses serializing lan deserializing obyek. Mula ayo dirembug dhisik babagan iki. Apa sing didhelikake modifier transient ing Jawa - 2Upaminipun kita duwe sawetara obyek, lan wis kothak, saben kang wis sawetara Nilai. Kabeh iki diarani negara obyek. Serialisasi yaiku konversi status obyek dadi urutan bita. Byte iki biasane disimpen ing sawetara file. Deserialisasi minangka proses mbalikke. Bayangake manawa kita nggawe serial obyek dadi bita lan nyimpen set bait iki ing sawetara file. Nalika deserializing, program mbutuhake:
  1. Maca sakumpulan bita saka file.
  2. Mbangun obyek dhisikan saka set bita iki lan nyetel saben lapangan kanggo Nilai sing obyek wis ing wektu serialization.
Kapan iki bisa migunani? Contone, nalika kita pengin program kanggo nyimpen sawijining negara nalika mati lan mulihake ing wektu sabanjuré diuripake. Nalika sampeyan mateni IntelliJ IDEA, sampeyan bakal duwe tab lan kelas sing padha mbukak nalika sampeyan nguripake.

Ayo dadi elinga serialization ing laku

Inggih, saiki ayo kang katon ing serialization ing laku. Yen sampeyan pengin ngerti topik sing luwih apik, disaranake maca materi Serialisasi lan deserialization ing Jawa . Inggih, ing artikel iki kita bakal pindhah menyang ndhuwur lan langsung menyang conto. Ayo kita duwe kelas Userkanthi sawetara lapangan, getter lan setter, lan metode toString:
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private String firstName;
    private String lastName;
    private String email;
    private LocalDate birthDate;
    private String login;
    private String password;

    public User() {}

    public User(String firstName, String lastName, String email, LocalDate birthDate, String login, String password) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.birthDate = birthDate;
        this.login = login;
        this.password = password;
    }

    /*
        Геттеры, Сеттеры
     */

    @Override
    public String toString() {
        return "User{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", birthDate=" + birthDate +
                ", login='" + login + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
Kita pengin serialize obyek saka kelas iki ing mangsa. Ayo nulis cara sing njupuk obyek Userlan senar path- path menyang file sing bakal nyimpen bita:
static void serialize(User user, String path) throws IOException {
    FileOutputStream outputStream = null;
    ObjectOutputStream objectOutputStream = null;
    try {
        //create 2 threads to serialize the object and save it to a file
        outputStream = new FileOutputStream(path);
        objectOutputStream = new ObjectOutputStream(outputStream);

        // сохраняем an object в файл
        objectOutputStream.writeObject(user);
    } finally {
        // Закроем потоки в блоке finally
        if (objectOutputStream != null) {
            objectOutputStream.close();
        }
        if (outputStream != null) {
            outputStream.close();
        }
    }
}
Kita uga bakal nulis cara kanggo deserialization. Cara kasebut njupuk senar path(path menyang file saka ngendi obyek bakal "dimuat") lan ngasilake obyek saka jinis User:
static User deserialize(String path) throws IOException, ClassNotFoundException {
    FileInputStream fileInputStream = null;
    ObjectInputStream objectInputStream = null;

    try {

        //создаем 2 потока для десериализации an object из file
        fileInputStream = new FileInputStream(path);
        objectInputStream = new ObjectInputStream(fileInputStream);

        //загружаем an object из file
        return  (User) objectInputStream.readObject();
    } finally {
        if (fileInputStream != null) {
            fileInputStream.close();
        }
        if (objectInputStream != null) {
            objectInputStream.close();
        }
    }
}
Kabeh alat wis siyap dienggo. Wektu kanggo pamisah bita dadi atom . Ayo nulis cara mainsing nggawe obyek kelas Userlan nggawe serial. Banjur kita bakal mbukak lan mbandhingake karo sing asli:
public static void main(String[] args) throws IOException, ClassNotFoundException {
    // вставьте свой путь до file
    final String path = "/home/zor/user.ser";

    // create our object
    User user = new User();
    user.setFirstName("Stefan");
    user.setLastName("Smith");
    user.setEmail("ssmith@email.com");
    user.setBirthDate(LocalDate.of(1991, 7, 16));
    user.setLogin("ssmith");
    user.setPassword("gemma_arterton_4ever_in_my_heart91");

    System.out.println("Initial user: " + user + "\r\n");


    serialize(user, path);
    User loadedUser = deserialize(path);
    System.out.println("Loaded user from file: " + loadedUser + "\r\n");
}
Yen kita mbukak metode kasebut, kita bakal weruh output ing ngisor iki:
Initial user: User{firstName='Stefan', lastName='Smith', email='ssmith@email.com', birthDate=1991-07-16, login='ssmith', password='gemma_arterton_4ever_in_my_heart91'}

Loaded user from file: User{firstName='Stefan', lastName='Smith', email='ssmith@email.com', birthDate=1991-07-16, login='ssmith', password='gemma_arterton_4ever_in_my_heart91'}
Nalika sampeyan bisa ndeleng saka output, obyek padha. Nanging ana sing cilik nanging... Lan iki persis ing ngendi malu Spanyol transient teka menyang muter .

Modifier (akhire)transient

Apa ana sing bingung yen kita nyimpen sandhi pangguna? Utamane tembung sandhi kasebut ... Ya, ya, kita wis nggawe dhewe, nanging isih ... Kadhangkala ana kahanan nalika sawetara kolom ora bisa serial, utawa luwih becik ora nindakake iki. Ing conto ing ndhuwur, aku pengin nyimpen kabeh kolom kajaba tembung sandhi. Kepiye carane entuk iki? Wangsulan: Bab ingkang utama - nggunakake modifier transient. transientyaiku modifier diselehake sadurunge lapangan kelas (padha karo modifiers liyane kayata public, finaletc.) kanggo nunjukaké sing lapangan ngirim ora serialized. Kolom sing ditandhani karo tembung kunci transientora serial. Saiki ayo ngowahi conto karo pangguna kanggo mbenerake kebingungan cilik lan ora nyimpen sandhi pangguna. Kanggo nindakake iki, tandhani kolom sing cocog ing kelas kanthi tembung kunci transient:
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private String firstName;
    private String lastName;
    private String email;
    private LocalDate birthDate;
    private String login;
    private transient String password;

    /*
        Конструкторы, геттеры, сеттеры, toString...
     */
}
Yen kita mbukak cara saka conto ing ndhuwur maneh main, kita bakal weruh sing sandi ora disimpen:
Initial user: User{firstName='Stefan', lastName='Smith', email='ssmith@email.com', birthDate=1991-07-16, login='ssmith', password='gemma_arterton_4ever_in_my_heart91'}

Loaded user from file: User{firstName='Stefan', lastName='Smith', email='ssmith@email.com', birthDate=1991-07-16, login='ssmith', password='null'}
Apik, kita entuk target lan ora nyimpen informasi rahasia. Utamane informasi kaya iki ... (nuwun sewu)

Nalika nggunakake transient?

Conto karo pangguna dibutuhake kanggo nyilem menyang konteks serialisasi. Saiki ayo ngomong luwih spesifik babagan kapan nggunakake modifier transient.

  • Fields sing diwilang programmatically

Sawetara kelas kadhangkala duwe lapangan sing diwilang adhedhasar lapangan utawa informasi liyane. Lagi diwilang, supaya ngomong, ing fly. Kanggo menehi conto lapangan kasebut, ayo bayangake pesenan ing toko online utawa sawetara layanan pangiriman panganan. Saben pesenan, ing antarane informasi liyane, kalebu dhaptar barang lan biaya total. Iku, ing siji, kasusun saka total biaya saben produk. Pranyata biaya pungkasan ora kudu disetel "kanthi tangan": kudu diwilang kanthi program, nyimpulake biaya kabeh barang. Bidang kaya iki sing kudu diwilang kanthi terprogram ora perlu serialisasi. Mulane, kita menehi tandha karo modifier transient.
class Order implements Serializable {

    private List items;
    private transient BigDecimal totalAmount; //вычисляется на ходу

}

  • Fields karo informasi pribadi

Ana uga sawetara kelas sing nyimpen informasi pribadi. Kita ndeleng conto kelas kasebut ing wiwitan artikel. Sampeyan kudu ora ngidini informasi kasebut bocor ing njaba JVM. Mulane, kolom karo data kuwi kudu ditandhani karo modifier transientyen sampeyan arep kanggo serialize kelas kuwi.

  • Lapangan sing ora ngleksanakake antarmukaSerializable

Kadhangkala kelas ngemot kolom - obyek saka kelas liyane sing ora ngleksanakake antarmuka Serializable. Conto kolom kasebut yaiku logger, stream I / O, obyek sing nyimpen sambungan database lan kelas sarana liyane. Yen sampeyan nyoba nggawe serialize obyek sing ngemot kolom non-serializable, sampeyan bakal nampa kesalahan java.io.NotSerializableException. Kanggo ngindhari iki, kabeh kolom sing ora ngetrapake antarmuka Serializablekudu ditandhani karo modifier transient.
public class FileReader implements Serializable {
    // Первые 2 поля не реализуют Serializable
    // Помечаем их How transient поля
    private transient InputStream is;
    private transient BufferedReader buf;
    private String fileName;

    // Constructors, Getters, Setters

    public String readFile() throws IOException {
        try {
            is = new FileInputStream(fileName);
            buf = new BufferedReader(new InputStreamReader(is));
            String line = buf.readLine();
            StringBuilder sb = new StringBuilder();
            while (line != null) {
                sb.append(line).append("\n");
                line = buf.readLine();
            }
            return sb.toString();
        } finally {
            if (buf != null) {
                buf.close();
            }
            if (is != null) {
                is.close();
            }
        }
    }
}

  • Fields karo informasi bab negara obyek

Inggih, siji bab pungkasan. Ora perlu kanggo serialize kolom sing ora bagean saka informasi negara obyek. Conto ing ndhuwur kalebu aturan iki. Nanging sampeyan uga bisa nyakup kabeh lapangan liyane sing ditambahake kanggo debugging utawa nindakake sawetara fungsi layanan sing ora nggawa informasi babagan kahanan obyek kasebut.

transientlanfinal

Asil

Mekaten. Dina iki kita ngomong babagan modifier transient:
  1. Kita ngelingi serialisasi ing teori lan praktik.
  2. We temen maujud sing supaya ora serialize sawetara kothak kelas, padha kudu ditandhani karo modifier a transient.
  3. Kita rembugan ing kahanan apa modifier iki kudu digunakake. Ana papat kahanan kaya mangkene:
    1. kolom sing diwilang kanthi program;
    2. lapangan sing ngemot informasi rahasia;
    3. kolom sing ora ngleksanakake antarmuka Serializable;
    4. kolom sing dudu bagéan saka negara obyek.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION