JavaRush /Java Blog /Random-TK /Java-da daşarky interfeýs

Java-da daşarky interfeýs

Toparda çap edildi
Salam! Bu gün Java obýektlerini seriallaşdyrmak we deserializasiýa etmek bilen tanyşlygymyzy dowam etdireris. Iň soňky leksiýada Serializable marker interfeýsi bilen tanyşdyk , ulanylyşynyň mysallaryna göz aýladyk we geçiş açar sözüni ulanyp serializasiýa prosesine nädip gözegçilik etmelidigini öwrendik . Elbetde, “prosesi dolandyrmak” güýçli söz. Bizde bir açar söz, bir wersiýa ID bar we esasan şu. Galan proses Java-yň içinde “gaty simli”, oňa girip bolmaýar. Amatlylyk nukdaýnazaryndan bu, elbetde, gowy. Hisöne işinde programmist diňe bir öz rahatlygyna däl, şeýlemi? :) Göz öňünde tutmaly başga faktorlar bar. Şonuň üçin Serializable Java-da serializasiýa-deserializasiýa üçin ýeke-täk gural däl. Bu gün “Externalizable” interfeýsi bilen tanyşarys . Itöne öwrenmäge geçmezden ozal hem size dogry bir sorag bolup biler: näme üçin bize başga bir gural gerek? SerializableIşimi başdan geçirdim, tutuş prosesiň awtomatiki ýerine ýetirilmegi begenip bilmeýär. Sereden mysallarymyz hem çylşyrymly däldi. Ylalaşyk näme? Näme üçin aslynda şol bir mesele üçin başga bir interfeýs? Hakykat, Serializableonuň birnäçe kemçilikleri bar. Olaryň käbirini sanap geçeliň:
  1. Çykyş. Interfeýsiň Serializableköp artykmaçlygy bar, ýöne ýokary öndürijilik olaryň biri däl.

Daşarky interfeýs bilen tanyşdyrmak - 2

Birinjiden , içerki mehanizm Serializableköp mukdarda hyzmat maglumatlary we iş wagtynda dürli wagtlaýyn maglumatlary döredýär.
Ikinjiden (bu meselä indi girip, boş wagtyňyz okamaly dälsiňiz), iş SerializableReflection API ulanmaga esaslanýar. Bu gapma-garşylyk size Java-da mümkin däl ýaly zatlary etmäge mümkinçilik berýär: mysal üçin, hususy meýdanlaryň bahalaryny üýtgediň. JavaRush-da Reflection API hakda ajaýyp makala bar , bu hakda şu ýerden okap bilersiňiz.

  1. Çeýeligi. Ulanylanda serializasiýa-deserializasiýa prosesine asla gözegçilik etmeýäris Serializable.

    Bir tarapdan, bu gaty amatly, sebäbi hakykatdanam öndürijilik bilen gyzyklanmasak, kod ýazmazlyk amatly ýaly görünýär. Reallyöne seriallaşdyrma logikasyna hakykatdanam käbir aýratynlyklarymyzy (olaryň biriniň mysaly aşakda bolar) goşmaly bolsa näme etmeli?

    Aslynda, prosese gözegçilik etmeli zatlarymyz, transientkäbir maglumatlary aýyrmak üçin açar söz we hut şu. “Gurallar toplumy” ýaly tertipläň: /

  2. Howpsuzlyk. Bu nokat öňküsinden bölekleýin gelýär.

    Bu barada öň kän pikir etmedik, ýöne synpyňyzdaky käbir maglumatlar “beýleki adamlaryň gulaklary” (has takygy, gözler) üçin niýetlenmedik bolsa näme etmeli? Simpleönekeý mysal, häzirki dünýäde bir topar kanunlar bilen düzgünleşdirilýän ulanyjynyň paroly ýa-da beýleki şahsy maglumatlary.

    Ulanylanda Serializable, aslynda bu hakda hiç zat edip bilmeris. Hemme zady bolşy ýaly seriallaşdyrýarys.

    , Öne, gowy görnüşde, faýla ýazmazdan ýa-da tora geçirmezden ozal şular ýaly maglumatlary şifrlemeli. Emma Serializablebu mümkinçilik bermeýär.

Daşarky interfeýs bilen tanyşdyrmak - 3Geliň, ahyrsoňy synpy ulanmagyň nähili boljakdygyny göreliň Externalizable.
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class UserInfo implements Externalizable {

   private String firstName;
   private String lastName;
   private String superSecretInformation;

private static final long SERIAL_VERSION_UID = 1L;

   //...конструктор, геттеры, сеттеры, toString()...

   @Override
   public void writeExternal(ObjectOutput out) throws IOException {

   }

   @Override
   public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {

   }
}
Görşüňiz ýaly, möhüm üýtgeşmeler etdik! Esasy biri düşnüklidir: interfeýs ýerine ýetirilende Externalizableiki hökmany usuly ulanmaly - writeExternal()we readExternal(). Öň hem aýdyşymyz ýaly seriallaşdyrmak we deserializasiýa üçin ähli jogapkärçilik programmistiň üstüne düşer. Şeýle-de bolsa, indi bu prosese gözegçilik etmezlik meselesini çözüp bilersiňiz! Tutuş proses gönüden-göni siz tarapyndan programmirlendi, bu, elbetde has çeýe mehanizmi döredýär. Mundan başga-da, howpsuzlyk meselesi hem çözülýär. Görşüňiz ýaly, synpymyzda bir meýdan bar: şifrlenen saklanyp bilinmeýän şahsy maglumatlar. Indi bu çäklendirmä laýyk gelýän kody aňsatlyk bilen ýazyp bileris. Mysal üçin, gizlin maglumatlary şifrlemek we şifrlemek üçin synpymyza iki sany ýönekeý hususy usul goşuň. Olary bir faýla ýazarys we faýldan kodlanan görnüşde okarys. Galan maglumatlary bolsa bolşy ýaly ýazarys we okarys :) Netijede synpymyz şuňa meňzeş bir zat görüner:
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Base64;

public class UserInfo implements Externalizable {

   private String firstName;
   private String lastName;
   private String superSecretInformation;

   private static final long serialVersionUID = 1L;

   public UserInfo() {
   }

   public UserInfo(String firstName, String lastName, String superSecretInformation) {
       this.firstName = firstName;
       this.lastName = lastName;
       this.superSecretInformation = superSecretInformation;
   }

   @Override
   public void writeExternal(ObjectOutput out) throws IOException {
       out.writeObject(this.getFirstName());
       out.writeObject(this.getLastName());
       out.writeObject(this.encryptString(this.getSuperSecretInformation()));
   }

   @Override
   public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
       firstName = (String) in.readObject();
       lastName = (String) in.readObject();
       superSecretInformation = this.decryptString((String) in.readObject());
   }

   private String encryptString(String data) {
       String encryptedData = Base64.getEncoder().encodeToString(data.getBytes());
       System.out.println(encryptedData);
       return encryptedData;
   }

   private String decryptString(String data) {
       String decrypted = new String(Base64.getDecoder().decode(data));
       System.out.println(decrypted);
       return decrypted;
   }

   public String getFirstName() {
       return firstName;
   }

   public String getLastName() {
       return lastName;
   }

   public String getSuperSecretInformation() {
       return superSecretInformation;
   }
}
Leksiýada eýýäm duş gelen parametrler bilen birmeňzeş ObjectOutput outwe parametrleri ulanýan iki usuly durmuşa geçirdik . Dogry wagtda zerur maglumatlary şifrleýäris ýa-da şifrleýäris we bu görnüşde obýektimizi seriallaşdyrmak üçin ulanýarys. Munuň iş ýüzünde nähili boljakdygyny göreliň: ObjectInputSerializable
import java.io.*;

public class Main {

   public static void main(String[] args) throws IOException, ClassNotFoundException {

       FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\save.ser");
       ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

       UserInfo userInfo = new UserInfo("Ivan", "Ivanov", "Ivan Ivanov's passport data");

       objectOutputStream.writeObject(userInfo);

       objectOutputStream.close();

   }
}
Usullarda encryptString()we usullarda decryptString()gizlin maglumatlaryň haýsy görnüşde ýazyljakdygyny we okaljakdygyny barlamak üçin konsola çykyş goşduk. Aboveokardaky kod konsola aşakdaky setiri çykarýar: SXZhbiBJdmFub3YncyBwYXNzcG9ydCBkYXRh Şifrlemek şowly boldy! Faýlyň doly mazmuny şuňa meňzeýär: ¬n sr UserInfoG!
public class Main {

   public static void main(String[] args) throws IOException, ClassNotFoundException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\save.ser");
       ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);


       UserInfo userInfo = (UserInfo) objectInputStream.readObject();
       System.out.println(userInfo);

       objectInputStream.close();

   }
}
Dogrusy, bu ýerde çylşyrymly zat ýok ýaly, işlemeli! Işledeliň ... "esasy" sapakdaky kadadan çykma java.io.InvalidClassException: UserInfo; dogry konstruktor ýok Daşarky interfeýs bilen tanyşdyrmak - 4 Oops :( Bu gaty ýönekeý däldi! Deserializasiýa mehanizmi kadadan çykma etdi we deslapky konstruktor döretmegimizi talap etdi. Näme üçin? SerializableBiz onsuz dolandyrdyk ...: / Ine, başga bir möhüm meselä gelýäris SerializableArasyndaky tapawut Externalizablediňe bir programmist üçin “giňeldilen” girişde we prosesi has çeýe dolandyrmak ukybynda däl, eýsem prosesiň özünde-de bar. Ilki bilen deserializasiýa mehanizminde ... Ulanylanda Serializableýat ýönekeý bolýar obýekt üçin bölünip berilýär, şondan soň ähli meýdanlaryny doldurýan akymdan bahalar okalýar. Eger ulansak Serializable, obýekt konstruktory çagyrylmaýar! workhli işler şöhlelendirme arkaly amala aşyrylýar (Soňky döwürde gysgaça belläp geçen Reflection API) leksiýa). Şeýle ýagdaýda Externalizabledeserializasiýa mehanizmi başgaça bolar. Ilki başda deslapky konstruktor diýilýär. Diňe şondan soň obýektiň meýdanlaryny doldurmak üçin UserInfodöredilen döredilen obýekt usuly çagyrylýar . readExternal()näme üçin interfeýsi amala aşyrýan islendik synpda Externalizabledeslapky konstruktor bolmaly . Geliň, synpymyza goşalyň UserInfowe kody täzeden işledeliň:
import java.io.*;

public class Main {

   public static void main(String[] args) throws IOException, ClassNotFoundException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\save.ser");
       ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);


       UserInfo userInfo = (UserInfo) objectInputStream.readObject();
       System.out.println(userInfo);

       objectInputStream.close();
   }
}
Konsol çykyşy: Iwan Iwanowyň pasport maglumatlary UserInfo {firstName = 'Iwan', lastName = 'Iwanow', superSecretInformation = 'Iwan Iwanowyň pasport maglumatlary'} düýbünden başga mesele! Ilki bilen gizlin maglumatlar bilen şifrlenen setir konsola çykdy, soňra obýektimiz faýldan sim görnüşinde dikeldildi! Thehli meseleleri şeýdip üstünlikli çözdük :) Serializasiýa we deserializasiýa mowzugy ýönekeý ýaly görünýär, ýöne görşüňiz ýaly leksiýalarymyz uzyn boldy. Bularyň hemmesi däl! Bu interfeýsleriň hersini ulananyňyzda başga-da köp inçelikler bar, ýöne indi beýniňiz täze maglumatlaryň göwrüminden ýarylmaz ýaly, has möhüm nokatlary gysgaça sanap geçerin we goşmaça okamaga baglanyşyk bererin. Onda başga näme bilmeli? Ilki bilen , seriallaşdyrylanda (ulanmagyňyz Serializableýa-da tapawudyňyz ýok Externalizable) üýtgeýänlere üns beriň static. Ulanylanda Serializablebu meýdanlar asla seriýalaşdyrylmaýar (we şoňa görä-de olaryň bahasy üýtgemeýär, sebäbi staticmeýdanlar obýekt däl-de, klasa degişlidir). Itöne ony ulananyňyzda Externalizableprosese özüňiz gözegçilik edýärsiňiz, şonuň üçin tehniki taýdan bu edilip bilner. Itöne maslahat berilmeýär, sebäbi bu inçe ýalňyşlyklar bilen doldurylýar. Ikinjiden , üýtgediji bilen üýtgeýänlere hem üns berilmelidir final. Ulanylanda, Serializableadatdakysy ýaly seriallaşdyrylýar we deserializasiýa edilýär, ýöne ulanylanda üýtgeýjini Externalizabledeserializasiýa etmekfinal mümkin däl ! Sebäbi ýönekeý: ähli finalmeýdançalar deslapky konstruktor çagyrylanda başlaýar we şondan soň olaryň bahasy üýtgedilip bilinmez. Şol sebäpden, meýdanlary öz içine alýan obýektleri seriallaşdyrmak üçin final, adaty seriallaşdyrma ulanyň Serializable. Üçünjiden , miras ulanylanda, käbir Externalizablesynpdan gelýän miras synplarynyň hemmesinde deslapky konstruktorlar bolmaly. Ynha, seriallaşdyrma mehanizmleri barada gowy makalalara käbir baglanyşyklar: Görüşýänçäk! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION