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!
Baýtlary atomlara bölmegiň wagty geldi . Ispaniýanyň utanjynyň Üýtgediji (ahyrynda)
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ň
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
Ş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.
Käwagt synpda interfeýsi amala aşyrmaýan beýleki synplaryň obýektleri bar
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.
Seriallaşdyrmagy ýada salalyň
Üýtgedijitransient
obýektleri seriallaşdyrmak we deserializasiýa etmek prosesinde ulanylýar. Geliň, ilki bilen bu barada gysgaça gürleşeliň. Bizde 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:
- Bir faýldan baýtlar toplumyny okaň.
- Bu baýtlar toplumyndan başlangyç obýekti guruň we her meýdany seriýalaşma wagtynda obýektiň bahasyna düzüň.
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.User
Kä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 User
we 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. main
Geliň , synp obýektini döredýän User
we 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 ... 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 transient
synp meýdançasynyň öňünde goýlan üýtgediji (beýleki üýtgeýjilere meňzeş public
we ş.m.). final
Açar söz bilen bellenen meýdanlar transient
yzygiderli 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ýdanlar
Serializable
Käwagt synpda interfeýsi amala aşyrmaýan beýleki synplaryň obýektleri bar Serializable
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.
transient
Wefinal
Netijeler
Bu hemmesi. Bu gün üýtgediji barada gürleşdiktransient
:
- Teoriýa we amaly taýdan seriallaşdyrmagy ýada saldyk.
- Synpyň käbir meýdanlaryny seriallaşdyrmazlyk üçin, üýtgediji bilen bellik edilmelidigine düşündik
transient
. - Bu üýtgedijiniň haýsy ýagdaýlarda ulanylmalydygyny ara alyp maslahatlaşdyk. Şeýle dört ýagdaý bardy:
- programma taýdan hasaplanylýan meýdanlar;
- gizlin maglumatlary öz içine alýan meýdanlar;
- interfeýsi amala aşyrmaýan meýdanlar
Serializable
; - obýektiň ýagdaýyna girmeýän meýdanlar.
GO TO FULL VERSION