JavaRush /Java Blog /Random-TK /Wagtlaýyn üýtgediji Java-da näme gizleýär?
Анзор Кармов
Dereje
Санкт-Петербург

Wagtlaýyn üýtgediji Java-da näme gizleýär?

Toparda çap edildi
Salam! Şu günki makalamyzda Java-da wagtlaýyn üýtgedijä serederis. Geliň, bu üýtgedijiniň näme üçin zerurdygy we ony nädip dogry ulanmalydygy barada gürleşeliň. Git! Wagtlaýyn üýtgediji Java-da näme gizleýär - 1

Seriallaşdyrmagy ýada salalyň

Üýtgediji transientobýektleri seriallaşdyrmak we deserializasiýa etmek prosesinde ulanylýar. Geliň, ilki bilen bu barada gysgaça gürleşeliň. Wagtlaýyn üýtgediji Java-da näme gizleýär - 2Bizde haýsydyr bir obýekt bar we hersiniň belli bir bahasy bolan meýdanlary bar diýeliň. Bularyň hemmesine obýektiň ýagdaýy diýilýär. Seriýalaşdyrmak, obýektiň ýagdaýyny baýtlaryň yzygiderliligine öwürmekdir. Bu baýtlar adatça käbir faýlda saklanýar. Deserializasiýa ters prosesdir. Bir obýekti baýtlara bölüp, bu baýtlar toplumyny käbir faýlda saklandygymyzy göz öňüne getireliň. Deserializasiýa edilende programma zerur:
  1. Bir faýldan baýtlar toplumyny okaň.
  2. Bu baýtlar toplumyndan başlangyç obýekti guruň we her meýdany seriýalaşma wagtynda obýektiň bahasyna düzüň.
Bu haçan peýdaly bolup biler? Mysal üçin, programma ýapylanda ýagdaýyny tygşytlamagy we indiki gezek açylanda dikeltmegini islänimizde. IntelliJ IDEA-ny ýapanyňyzda, indiki gezek açanyňyzda şol bir tabulýasiýa we synp açylar.

Iş ýüzünde seriallaşdyrmagy ýada salalyň

Bolýar, indi iş ýüzünde serializasiýa seredeliň. Mowzuga has gowy düşünmek isleseňiz, Java-da Serializasiýa we deserializasiýa materialyny okamagyňyzy maslahat berýäris . Dogrusy, bu makalada ýokardan geçeris we göni mysallara geçeris. UserKäbir meýdanlar, getterler we sazlaýjylar we usul bar bolan synpymyz bar diýeliň 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 + '\'' +
                '}';
    }
}
Geljekde bu synpyň obýektlerini seriallaşdyrmak isleýäris. Geliň, obýekti Userwe setiri alýan usuly ýazalyň path- baýtlary ýatda saklajak faýlymyza barýan ýol:
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();
        }
    }
}
Şeýle hem deserializasiýa usulyny ýazarys. Usul bir setir alýar path(obýektiň “ýüklenjek faýlyna barýan ýol”) we görnüşdäki obýekti yzyna gaýtaryp berýär 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();
        }
    }
}
Toolshli gurallar ulanmaga taýýar. Baýtlary atomlara bölmegiň wagty geldi . mainGeliň , synp obýektini döredýän Userwe seriallaşdyrýan usulymyzy ýazalyň . Soňra ony ýükläris we başdakylar bilen deňeşdireris:
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");
}
Usuly işletsek, aşakdaky çykyşy göreris:
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'}
Çykyşdan görnüşi ýaly, obýektler birmeňzeş. Aöne kiçijik, ýöne ... Ispaniýanyň utanjynyň transient hut şu ýeri ýüze çykýar .

Üýtgediji (ahyrynda)transient

Ulanyjynyň parolyny ýatda sakladykmy? Esasanam şeýle parol ... Hawa, hawa, özümiz tapdyk, ýöne şonda-da ... Käwagt käbir meýdanlary seriallaşdyryp bolmaýan ýagdaýlar bolýar ýa-da muny etmezlik has gowudyr. Aboveokardaky mysalda, paroldan başga ähli meýdanlary ýatda saklamak isleýärin. Muny nädip gazanmaly? Jogap: üýtgedijini ulanyň transient. meýdançanyň seriýalanmaly däldigini görkezmek üçin transientsynp meýdançasynyň öňünde goýlan üýtgediji (beýleki üýtgeýjilere meňzeş publicwe ş.m.). finalAçar söz bilen bellenen meýdanlar transientyzygiderli däl. Indi kiçijik bulaşyklygy düzetmek we ulanyjynyň parolyny ýatda saklamak üçin mysalymyzy ulanyjy bilen üýtgedeliň. Munuň üçin synpdaky degişli meýdany açar söz bilen belläň 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...
     */
}
Usuly ýokardaky mysaldan täzeden işlesek main, parolyň saklanmandygyny göreris:
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'}
Ajaýyp, maksadymyza ýetdik we gizlin maglumatlary saklamaýarys. Esasanam şular ýaly maglumatlar ... (bagyşlaň)

Wagtlaýyn haçan ulanmaly?

Serializasiýa kontekstine çümmek üçin ulanyjy bilen bir mysal gerekdi. Indi üýtgedijini haçan ulanmalydygy barada has anyk gürleşeliň transient.

  • Programma taýdan hasaplanan meýdanlar

Käbir synplarda käwagt beýleki meýdanlara ýa-da beýleki maglumatlara esaslanyp hasaplanýan meýdanlar bolýar. Başgaça aýdylanda, uçuşda hasaplanýar. Şeýle ugurdan mysal getirmek üçin, onlaýn dükanda ýa-da azyk önümlerini eltip bermek hyzmatynda sargyt göz öňüne getireliň. Her bir sargyt, beýleki maglumatlar bilen birlikde, harytlaryň sanawyndan we umumy bahasyndan durýar. Bu bolsa öz gezeginde her önümiň umumy bahasyndan durýar. Netijede, ahyrky çykdajy “el bilen” kesgitlenmeli däl: ähli harytlaryň bahasyny jemläp, programma taýdan hasaplanmaly. Programma taýdan hasaplanmaly şular ýaly meýdanlary seriýalaşdyrmak zerurlygy ýok. Şonuň üçin olary üýtgediji bilen belleýäris transient.
class Order implements Serializable {

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

}

  • Şahsy maglumatlar bilen meýdanlar

Şahsy maglumatlary saklaýan käbir synplar hem bar. Makalanyň başynda şeýle synpyň mysalyna göz aýladyk. Şeýle maglumatlaryň JVM-den daşarda syzmagyna ýol bermeli däl. transientŞonuň üçin şeýle synpy seriallaşdyrjak bolsaňyz, şeýle maglumatlary bolan meýdanlar üýtgediji bilen bellik edilmelidir .

  • Interfeýsi amala aşyrmaýan meýdanlarSerializable

Käwagt synpda interfeýsi amala aşyrmaýan beýleki synplaryň obýektleri bar Serializable. Şeýle meýdanlara ýazyjylar, I / O akymlary, maglumat bazasynyň birikmelerini saklaýan obýektler we beýleki peýdaly synplar mysal bolup biler. Seriallaşdyrylmaýan meýdanlary öz içine alýan obýekti seriallaşdyrjak bolsaňyz, ýalňyşlyk alarsyňyz java.io.NotSerializableException. Munuň öňüni almak üçin interfeýsi amala aşyrmaýan ähli meýdanlar Serializableüýtgediji bilen bellik edilmelidir 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();
            }
        }
    }
}

  • Obýektiň ýagdaýy barada maglumatly meýdanlar

Soňky bir zat. Obýektiň döwlet maglumatlarynyň bir bölegi bolmadyk meýdanlary seriallaşdyrmagyň zerurlygy ýok. Aboveokardaky mysallar şu düzgüne degişlidir. Alsoöne bu ýerde düzediş ýa-da obýektiň ýagdaýy barada maglumat bermeýän haýsydyr bir hyzmat funksiýasyny ýerine ýetirmek üçin goşulan beýleki meýdanlary hem goşup bilersiňiz.

transientWefinal

Netijeler

Bu hemmesi. Bu gün üýtgediji barada gürleşdik transient:
  1. Teoriýa we amaly taýdan seriallaşdyrmagy ýada saldyk.
  2. Synpyň käbir meýdanlaryny seriallaşdyrmazlyk üçin, üýtgediji bilen bellik edilmelidigine düşündik transient.
  3. Bu üýtgedijiniň haýsy ýagdaýlarda ulanylmalydygyny ara alyp maslahatlaşdyk. Şeýle dört ýagdaý bardy:
    1. programma taýdan hasaplanylýan meýdanlar;
    2. gizlin maglumatlary öz içine alýan meýdanlar;
    3. interfeýsi amala aşyrmaýan meýdanlar Serializable;
    4. obýektiň ýagdaýyna girmeýän meýdanlar.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION