Answers:
transient
ක්ෂේත්රයක් අනුක්රමිකකරණයේ කොටසක් නොවිය යුතු බව දැක්වීමට ජාවා හි මූල පදය භාවිතා කරයි (එයින් අදහස් වන්නේ ගොනුවකට සමාන ලෙස සුරකින ලදි ).
සිට ජාවා භාෂාව පිරිවිතර, ජාවා SE 7 සංස්කරණය , වගන්තිය 8.3.1.3. transient
ක්ෂේත්ර :
විචල්යයන්
transient
වස්තුවක අඛණ්ඩ තත්වයේ කොටසක් නොවන බව දැක්වීමට සලකුණු කළ හැකිය .
නිදසුනක් ලෙස, ඔබට වෙනත් ක්ෂේත්රයන්ගෙන් ව්යුත්පන්න වූ ක්ෂේත්ර තිබිය හැකි අතර, එය කළ යුත්තේ අනුක්රමිකකරණය හරහා රාජ්යය දිගටම පැවතීමට වඩා ක්රමලේඛිකව පමණි.
GalleryImage
රූපයක් සහ රූපයෙන් ලබාගත් සිඟිති රූපයක් අඩංගු පන්තියක් මෙන්න :
class GalleryImage implements Serializable
{
private Image image;
private transient Image thumbnailImage;
private void generateThumbnail()
{
// Generate thumbnail.
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
generateThumbnail();
}
}
මෙම උදාහරණයේ දී, thumbnailImage
මෙය සිඟිති රූපයකි generateThumbnail
.
මෙම thumbnailImage
ක්ෂේත්ර සලකුණු කර transient
ඒ පමණක් මුල්, image
ඒ වෙනුවට මුල් ප්රතිරූපය හා සිඟිති රූප දෙකම ඕනෑකමින් නොකඩවා වඩා serialized ඇත. මෙයින් අදහස් කරන්නේ අනුක්රමික වස්තුව සුරැකීමට අඩු ගබඩා කිරීමක් අවශ්ය බවයි. (ඇත්ත වශයෙන්ම, පද්ධතියේ අවශ්යතා මත පදනම්ව මෙය යෝග්ය විය හැකිය හෝ නොවිය හැකිය - මෙය උදාහරණයක් පමණි.)
ආශ්රිතකරණයේදී, readObject
වස්තුවෙහි තත්වය අනුක්රමිකකරණය සිදු වූ තත්වයට නැවත යථා තත්ත්වයට පත් කිරීම සඳහා අවශ්ය ඕනෑම මෙහෙයුමක් සිදු කිරීමට මෙම ක්රමය හැඳින්වේ. මෙන්න, සිඟිති-රූපය ජනනය කළ යුතුය, එබැවින් readObject
ක්රමය ඉක්මවා ගොස් ඇති අතර එමඟින් generateThumbnail
ක්රමවේදය ඇමතීමෙන් සිඟිති-රූපය ජනනය වේ.
අමතර තොරතුරු සඳහා, ජාවා අනුක්රමිකකරණ API ලිපියේ රහස් සොයා ගන්න (එය මුලින් සූර්ය සංවර්ධක ජාලයෙන් ලබා ගත හැකි විය) transient
සමහර අංශවල අනුක්රමිකකරණය වැළැක්වීම සඳහා මූල පදය භාවිතා කරන අවස්ථා පිළිබඳව සාකච්ඡා කරන සහ ඉදිරිපත් කරන අංශයක් ඇත.
transient
මූල පදය තේරුම් ගැනීමට පෙර යමෙකු අනුක්රමිකකරණය පිළිබඳ සංකල්පය තේරුම් ගත යුතුය. අනුක්රමිකකරණය ගැන පා er කයා දන්නේ නම්, කරුණාකර පළමු කරුණ මඟ හරින්න.
අනුක්රමිකකරණය යනු වස්තුවේ තත්වය නොනැසී පවතින ක්රියාවලියකි. එහි අර්ථය වන්නේ වස්තුවෙහි තත්වය දිගටම පැවතීම සඳහා භාවිතා කළ හැකි බයිට් ප්රවාහයක් බවට පරිවර්තනය කිරීමයි (උදා: ගොනුවක බයිට් ගබඩා කිරීම) හෝ මාරු කිරීම (උදා: ජාලයක් හරහා බයිට් යැවීම). එලෙසම, බයිට් වලින් වස්තුවේ තත්වය නැවත ගෙන ඒමට අපට ඩෙසරීකරණය භාවිතා කළ හැකිය. මෙය ජාවා ක්රමලේඛනයේ වැදගත් සංකල්පවලින් එකකි, මන්ද අනුක්රමිකකරණය බොහෝ දුරට ජාල වැඩසටහන්කරණයේ භාවිතා වේ. ජාලය හරහා සම්ප්රේෂණය කළ යුතු වස්තූන් බයිට් බවට පරිවර්තනය කළ යුතුය. ඒ සඳහා සෑම පන්තියක් හෝ අතුරු මුහුණතක්ම අතුරු මුහුණත ක්රියාත්මක කළ යුතුය Serializable
. එය කිසිදු ක්රමයක් නොමැතිව සලකුණු අතුරුමුහුණතකි.
transient
මූලික පදය සහ එහි අරමුණ කුමක්ද?පෙරනිමියෙන්, වස්තුවේ සියලු විචල්යයන් අඛණ්ඩ තත්වයකට පරිවර්තනය වේ. සමහර අවස්ථා වලදී, සමහර විචල්යයන් දිගටම පැවතීමෙන් වැළකී සිටීමට ඔබට අවශ්ය විය හැකිය, මන්ද එම විචල්යයන් දිගටම පවත්වා ගැනීමේ අවශ්යතාවයක් ඔබට නොමැති බැවිනි. එබැවින් ඔබට එම විචල්යයන් ලෙස ප්රකාශ කළ හැකිය transient
. විචල්යය ලෙස ප්රකාශයට පත් කළ transient
හොත් එය නොනැසී පවතිනු ඇත. transient
මූල පදයේ ප්රධාන අරමුණ එයයි .
ඉහත කරුණු දෙක පහත උදාහරණයෙන් පැහැදිලි කිරීමට මට අවශ්යය:
package javabeat.samples;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class NameStore implements Serializable{
private String firstName;
private transient String middleName;
private String lastName;
public NameStore (String fName, String mName, String lName){
this.firstName = fName;
this.middleName = mName;
this.lastName = lName;
}
public String toString(){
StringBuffer sb = new StringBuffer(40);
sb.append("First Name : ");
sb.append(this.firstName);
sb.append("Middle Name : ");
sb.append(this.middleName);
sb.append("Last Name : ");
sb.append(this.lastName);
return sb.toString();
}
}
public class TransientExample{
public static void main(String args[]) throws Exception {
NameStore nameStore = new NameStore("Steve", "Middle","Jobs");
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("nameStore"));
// writing to object
o.writeObject(nameStore);
o.close();
// reading from object
ObjectInputStream in = new ObjectInputStream(new FileInputStream("nameStore"));
NameStore nameStore1 = (NameStore)in.readObject();
System.out.println(nameStore1);
}
}
ප්රතිදානය පහත පරිදි වේ:
First Name : Steve
Middle Name : null
Last Name : Jobs
මැද නම ලෙස ප්රකාශයට පත් කර ඇති transient
බැවින් එය අඛණ්ඩ ගබඩාවේ ගබඩා නොවේ.
NameFormatter
පැදවීමට භාවිතා toString()
. හෝ වින්යාස කිරීම, හෝ බැලීම හෝ ව්යාපාර තර්කනය, ... දත්ත වලට පටහැනි වෙනත් දෙයක්.
ඔබට අනුක්රමික කිරීමට අවශ්ය නොවන විචල්යයන් අර්ථ දැක්වීමට ඔබට ඉඩ දීම.
වස්තුවක ඔබට අනුක්රමික කිරීමට / නොනැසී සිටීමට අවශ්ය තොරතුරු තිබිය හැකිය (සමහර විට මව් කර්මාන්තශාලා වස්තුවක් පිළිබඳ සඳහනක්), හෝ සමහර විට එය අනුක්රමික කිරීම අර්ථවත් නොවේ. මේවා 'අස්ථිර' ලෙස සලකුණු කිරීමෙන් අදහස් කරන්නේ අනුක්රමිකකරණ යාන්ත්රණය මෙම ක්ෂේත්ර නොසලකා හරිනු ඇති බවයි.
මගේ කුඩා දායකත්වය:
අස්ථිර ක්ෂේත්රයක් යනු කුමක්ද?
මූලික වශයෙන්, යතුරුපදය සමඟ වෙනස් කරන ඕනෑම ක්ෂේත්රයක් transient
අස්ථිර ක්ෂේත්රයකි.
ජාවා හි අස්ථිර ක්ෂේත්ර අවශ්ය වන්නේ ඇයි?
මෙම transient
මූල පදය ඔබ serialization ක්රියාවලිය කෙරෙහි යම් පාලනයක් ලබා දෙන අතර ඔබ මෙම ක්රියාවලිය යම් වස්තුවක ගුණාංගයන්ගේ බැහැර කිරීමට ඉඩ දෙයි. ජාවා වස්තූන් නොනැසී පැවතීම සඳහා අනුක්රමිකකරණ ක්රියාවලිය භාවිතා කරනු ලැබේ, බොහෝ දුරට ඒවායේ ස්ථාන මාරු කරන විට හෝ අක්රියව පවතින විට ඒවා ආරක්ෂා කර ගත හැකිය. සමහර විට, වස්තුවක ඇතැම් ගුණාංග අනුක්රමික නොකිරීමට එය අර්ථවත් කරයි.
ඔබ අස්ථිර ලෙස සලකුණු කළ යුතු ක්ෂේත්ර මොනවාද?
දැන් අපි එහි අරමුණ දනිමුtransient
මූල පදය සහ අස්ථිර ක්ෂේත්ර, අස්ථිර ලෙස සලකුණු කළ යුතු ක්ෂේත්ර මොනවාදැයි දැන ගැනීම වැදගත්ය. ස්ථිතික ක්ෂේත්ර අනුක්රමික නොවේ, එබැවින් අනුරූපී පදය ද උපක්රමය කරයි. නමුත් මෙය ඔබගේ පන්ති සැලසුම විනාශ කළ හැකිය; transient
ගලවා ගැනීම සඳහා මූලික පදය පැමිණෙන්නේ මෙහිදීය . අන් අයගෙන් සාරධර්ම ලබා ගත හැකි ක්ෂේත්ර අනුක්රමික කිරීමට ඉඩ නොදීමට මම උත්සාහ කරමි, එබැවින් මම ඒවා අස්ථිර ලෙස සලකුණු කරමි. ඔබට interest
වෙනත් ක්ෂේත්රයන්ගෙන් ( principal
, rate
& time
) ගණනය කළ හැකි ක්ෂේත්රයක් තිබේ නම්, එය අනුක්රමික කිරීමට අවශ්ය නොවේ.
තවත් හොඳ උදාහරණයක් වන්නේ ලිපි වචන ගණනය කිරීම් ය. ඔබ සම්පූර්ණ ලිපියක්ම සුරකිනවා නම්, වචන ගණන සුරැකීමේ අවශ්යතාවයක් නැත, මන්ද ලිපිය "පාළුකර" වූ විට එය ගණනය කළ හැකිය. නැතහොත් ල gers ු-සටහන් ගැන සිතන්න;Logger
අවස්ථා කිසි විටෙකත් අනුක්රමිකකරණය කිරීමට අවශ්ය නොවන බැවින් ඒවා අස්ථිර බවට පත් කළ හැකිය.
transient
transient
ඒ transient
විචල්ය serialized කළ නොහැකි විය හැකි විචල්ය වේ.
මෙය මතකයට එන ප්රයෝජනවත් විය හැකි එක් උදාහරණයක් නම්, නිශ්චිත වස්තුවක සන්දර්භය තුළ පමණක් අර්ථවත් වන විචල්යයන් සහ ඔබ වස්තුව අනුක්රමිකව හා අභිමතකරණය කළ පසු එය අවලංගු වේ. එවැනි අවස්ථාවන්හිදී එම විචල්යයන් බවට පත්වීම ප්රයෝජනවත් වන අතර null
එමඟින් ඔබට අවශ්ය විටදී ප්රයෝජනවත් දත්ත සමඟ ඒවා නැවත ආරම්භ කළ හැකිය.
transient
පන්ති ක්ෂේත්රයක් අනුක්රමික කිරීමට අවශ්ය නොවන බව දැක්වීමට භාවිතා කරයි. බොහෝ විට හොඳම උදාහරණය Thread
ක්ෂේත්රයකි. සාමාන්යයෙන් අනුක්රමික කිරීමට කිසිදු හේතුවක් නැත Thread
, මන්ද එහි තත්වය ඉතා 'ප්රවාහ විශේෂිත' ය.
A
යොමු වූ serializable පන්ති B
(වගේ Thread
ඔබේ උදාහරණය තුල), එසේ නම් A
එක්කෝ සඳහනක් ලෙස ලකුණු කල යුතුය transient
XOR සමග සාධාරණ යමක් කිරීම සඳහා පෙරනිමි serialization ක්රියාවලිය යටපත් කිරීම කළ යුතුය B
XOR පමණක් serializable උප වර්ගිකරණයන් බව උපකල්පනය B
ඇත්තටම ආශ්රයෙන් නොවීමයි (එබැවින් සැබෑ උප පංතිය ඔවුන්ගේ "නරක" මවුපියන් ගැන සැලකිලිමත් විය යුතුය B
) XOR විසින් අනුක්රමිකකරණය අසාර්ථක වන බව පිළිගනී. එක් අවස්ථාවකදී (අස්ථිර ලෙස සලකුණු කර ඇත) B
ස්වයංක්රීයව සහ නිහ ly ව මඟ හැරේ.
ස්වදේශික ජාවා හැරුණු විට අනුක්රමිකකරණ පද්ධතිවලටද මෙම විකරණකාරකය භාවිතා කළ හැකිය. නිදසුනක් ලෙස, ශිශිරතාරකය ra ට්රාන්ස්පෙන්ට් හෝ අස්ථිර විකරණකාරකය සමඟ සලකුණු කර ඇති ක්ෂේත්ර නොපවතිනු ඇත . ටෙරකොටා ද මෙම විකරණකාරකයට ගරු කරයි.
නවීකරණයේ සංකේතාත්මක අරුත "මෙම ක්ෂේත්රය මතකයේ භාවිතය සඳහා පමණි. මෙම විශේෂිත වීඑම් එකෙන් පිටත කිසිදු ආකාරයකින් නොනවත්වා හෝ ගෙනයන්න එපා. එහි අතේ ගෙන යා නොහැකි". එනම් ඔබට වෙනත් VM මතක අවකාශයක එහි වටිනාකම මත විශ්වාසය තැබිය නොහැක. වාෂ්පශීලී ලෙස බොහෝ දේ ඔබට නිශ්චිත මතකය සහ නූල් අර්ථ නිරූපණයන් මත විශ්වාසය තැබිය නොහැක.
transient
එය මේ අවස්ථාවේ දී නිර්මාණය කර ඇත්නම් එය මූලික පදයක් නොවනු ඇත. ඔවුන් බොහෝ විට ව්යාඛ්යාවක් භාවිතා කරනු ඇත.
මක්නිසාද යත් සියලු විචල්යයන් අනුක්රමික කළ හැකි නොවන බැවිනි
මම මෙම ප්රශ්නයට ප්රතිචාර දැක්වීමට පෙර, මම ඔබට SERIALIZATION පැහැදිලි කළ යුතුය , මන්ද විද්යා පරිගණකයේ අනුක්රමිකකරණය යනු කුමක්දැයි ඔබ තේරුම් ගන්නේ නම් ඔබට මෙම මූල පදය පහසුවෙන් තේරුම් ගත හැකිය.
Serialization
වස්තුවක් ජාලය / භෞතික මාධ්ය සුරකින (ගොනු, ...) මගින් මාරු කර ඇති විට, වස්තුව "serialized" කළ යුතුය. අනුක්රමිකකරණය බයිට් තත්ව වස්තු ශ්රේණිය පරිවර්තනය කරයි. මෙම බයිට් ජාලයට යවනු ලැබේ / සුරකින අතර වස්තුව මෙම බයිට් වලින් නැවත නිර්මාණය වේ.
උදාහරණයක්
public class Foo implements Serializable
{
private String attr1;
private String attr2;
...
}
දැන් ඔබ එසේ කිරීමට අවශ්ය නම් TRANSFERT / ගැලවීම , මෙම වස්තුව ක්ෂේත්ර SO , ඔබ භාවිතා කළ හැකිය මූල පදය transient
private transient attr2;
අනුක්රමිකකරණය සමඟ යන සංවේදී දත්ත කිහිපයක් බෙදා ගැනීමට ඔබට අවශ්ය නැති විට එය අවශ්ය වේ.
Thread
(නිදසුනක් ලෙස @AH වෙත ණය), ඔබ එය අස්ථිර යැයි සලකුණු කරයි. කෙසේ වෙතත්, නූල් යනු සංවේදී දත්ත නොවන අතර එය අනුක්රමික කිරීමට කිසිදු තාර්කික අර්ථයක් නොදක්වයි (එය අනුක්රමික නොවේ).
ගූගල් අස්ථිර අර්ථයට අනුව == පවතින්නේ කෙටි කාලයක් සඳහා පමණි; අනිත්යයි.
දැන් ඔබට ජාවා හි ඕනෑම දෙයක් අස්ථිර කිරීමට අවශ්ය නම් අස්ථිර යතුරු පදය භාවිතා කරන්න.
ප්ර: අස්ථිර භාවිතා කළ යුත්තේ කොතැනින්ද?
පිළිතුර: සාමාන්යයෙන් ජාවා වලදී අපට දත්ත විචල්යයන්ගෙන් ලබා ගැනීමෙන් සහ එම විචල්යයන් ලිපිගොනු වලට ලිවීමෙන් දත්ත සුරැකිය හැක, මෙම ක්රියාවලිය අනුක්රමිකකරණය ලෙස හැඳින්වේ. දැන් අපට විචල්ය දත්ත ගොනුවට ලිවීම වළක්වා ගැනීමට අවශ්ය නම්, අපි එම විචල්යය අස්ථිර එකක් බවට පත් කරමු.
transient int result=10;
සටහන: අස්ථිර විචල්යයන් දේශීය විය නොහැක.
සරලව කිවහොත්, අස්ථිර ජාවා මූල පදය, ඒවායේ අස්ථිර නොවන ක්ෂේත්ර ප්රතිවිරුද්ධ කොටස් ලෙස අනුක්රමිකකරණය කිරීමෙන් ක්ෂේත්ර ආරක්ෂා කරයි.
මෙම කේත ස්නිපටයේ අපගේ වියුක්ත පංතිය BaseJob අනුක්රමික අතුරු මුහුණත ක්රියාත්මක කරයි, අපි BaseJob වෙතින් විහිදේ, නමුත් දුරස්ථ හා දේශීය දත්ත ප්රභවයන් අනුක්රමික කිරීම අවශ්ය නොවේ; සංවිධානයේ නම සහ සමමුහුර්ත ක්ෂේත්ර පමණක් අනුක්රමික කරන්න.
public abstract class BaseJob implements Serializable{
public void ShouldRetryRun(){}
}
public class SyncOrganizationJob extends BaseJob {
public String organizationName;
public Boolean isSynced
@Inject transient RemoteDataSource remoteDataSource;
@Inject transient LocalDaoSource localDataSource;
public SyncOrganizationJob(String organizationName) {
super(new
Params(BACKGROUND).groupBy(GROUP).requireNetwork().persist());
this.organizationName = organizationName;
this.isSynced=isSynced;
}
}
අස්ථිර-යතුරුපදය සඳහා සරල උදාහරණ කේතය.
import java.io.*;
class NameStore implements Serializable {
private String firstName, lastName;
private transient String fullName;
public NameStore (String fName, String lName){
this.firstName = fName;
this.lastName = lName;
buildFullName();
}
private void buildFullName() {
// assume building fullName is compuational/memory intensive!
this.fullName = this.firstName + " " + this.lastName;
}
public String toString(){
return "First Name : " + this.firstName
+ "\nLast Name : " + this.lastName
+ "\nFull Name : " + this.fullName;
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
buildFullName();
}
}
public class TransientExample{
public static void main(String args[]) throws Exception {
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("ns"));
o.writeObject(new NameStore("Steve", "Jobs"));
o.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("ns"));
NameStore ns = (NameStore)in.readObject();
System.out.println(ns);
}
}
අස්ථිර විකරණකාරකයක් සමඟ ප්රකාශයට පත් කරන ක්ෂේත්රයක් අනුක්රමික ක්රියාවලියට සහභාගී නොවනු ඇත. වස්තුවක් අනුක්රමිකව (ඕනෑම තත්වයක සුරකින විට), එහි අස්ථිර ක්ෂේත්රවල අගයන් අනුක්රමික නිරූපණය තුළ නොසලකා හරිනු ලබන අතර, අස්ථිර ක්ෂේත්ර හැර වෙනත් ක්ෂේත්ර අනුක්රමිකකරණ ක්රියාවලියට සහභාගී වේ. අස්ථිර යතුරු පදයේ ප්රධාන අරමුණ එයයි.
මක්නිසාද යත් සියලු විචල්යයන් අනුක්රමික කළ හැකි නොවන බැවිනි.
එබැවින් වස්තුව මතකයේ පැවතිය හැකි නමුත් තැටියේ නොවන්නේ නම්, එම වස්තුව අනුක්රමික කළ නොහැක, මන්ද යත්, යන්ත්රයට මතක සිතියම යථා තත්වයට පත් කළ නොහැකි බැවිනි. නිදසුනක් ලෙස, ඔබට Stream
වස්තුවක් අනුක්රමික කළ නොහැක .
ඔබට Connection
වස්තුවක් අනුක්රමිකකරණය කළ නොහැක , මන්ද එය තත්වය දුරස්ථ අඩවිය මත ද රඳා පවතී.
@DoNotSerialize
ඇයි?