Yanıtlar:
transient
Java anahtar bir alan (Kaydedilen demektir serileştirme parçası olmaması gerektiğini belirtmek için kullanılır gibi sürecine bir dosya için).
Gönderen Java Dil Şartname, Java SE 7 Sürümü , Bölüm 8.3.1.3. transient
Alanlar :
Değişkenler
transient
, bir nesnenin kalıcı durumunun bir parçası olmadığını belirtmek için işaretlenebilir .
Örneğin, diğer alanlardan türetilmiş alanlarınız olabilir ve durumun serileştirme yoluyla kalıcı hale getirilmesi yerine yalnızca programlı olarak yapılması gerekir.
İşte GalleryImage
bir görüntü ve görüntüden türetilmiş bir küçük resim içeren bir sınıf:
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();
}
}
Bu örnekte, yöntem thumbnailImage
çağrılarak oluşturulan küçük resim görüntüsüdür generateThumbnail
.
thumbnailImage
Saha işaretlenir transient
böylece sadece orijinal, image
orijinal görüntü ve küçük resim hem devam eden ziyade seri hale. Bu, serileştirilmiş nesneyi kaydetmek için daha az depolama alanı gerektiği anlamına gelir. (Elbette, sistemin gereksinimlerine bağlı olarak bu istenebilir veya istenmeyebilir - bu sadece bir örnektir.)
Serileştirme readObject
sırasında, nesnenin durumunu serileştirmenin gerçekleştiği duruma geri döndürmek için gerekli işlemleri gerçekleştirmek için yöntem çağrılır. Burada, küçük resmin oluşturulması gerekir, bu readObject
nedenle küçük resim generateThumbnail
yöntem çağrılarak oluşturulacak şekilde yöntem geçersiz kılınır .
Ek bilgi için, Java Serialization API'sının (başlangıçta Sun Developer Network'te bulunan) sırlarını keşfedin makalesinin transient
, belirli alanların serileştirilmesini önlemek için anahtar kelimenin kullanıldığını tartışan ve kullandığı bir senaryo vardır .
transient
Anahtar kelimeyi anlamadan önce , serileştirme kavramını anlamak gerekir. Okuyucu serileştirmeyi biliyorsa, lütfen ilk noktayı atlayın.
Serileştirme, nesnenin durumunu kalıcı hale getirme işlemidir. Bu, nesnenin durumunun kalıcı (örn. Bir dosyada bayt depolanması) veya aktarılması (örneğin bir ağ üzerinden bayt gönderilmesi) için kullanılacak bir bayt akışına dönüştürüldüğü anlamına gelir. Aynı şekilde, nesnenin durumunu baytlardan geri getirmek için serileştirmeyi kullanabiliriz. Bu, Java programlamasındaki önemli kavramlardan biridir çünkü serileştirme çoğunlukla ağ programlamasında kullanılır. Ağ üzerinden iletilmesi gereken nesnelerin bayta dönüştürülmesi gerekir. Bu amaçla, her sınıf veya arabirim arabirimi uygulamalıdır Serializable
. Herhangi bir yöntemi olmayan bir marker arayüzüdür.
transient
anahtar kelime ve amacı nedir?Varsayılan olarak, nesnenin tüm değişkenleri kalıcı duruma dönüştürülür. Bazı durumlarda, bazı değişkenleri devam ettirmekten kaçınmak isteyebilirsiniz, çünkü bu değişkenleri devam ettirmeniz gerekmez. Böylece bu değişkenleri olarak bildirebilirsiniz transient
. Değişken olarak bildirilirse transient
, kalıcı olmayacaktır. transient
Anahtar kelimenin ana amacı budur .
Yukarıdaki iki noktayı aşağıdaki örnekle açıklamak istiyorum:
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);
}
}
Ve çıktı aşağıdaki gibi olacaktır:
First Name : Steve
Middle Name : null
Last Name : Jobs
İkinci Ad olarak bildirilir transient
, bu nedenle kalıcı depolama alanında depolanmaz.
NameFormatter
kullanılmış bir referansımız olabilir toString()
. Veya yapılandırma, görüntüleme veya iş mantığı ile ilgili başka herhangi bir şey ... verilerin aksine.
Serileştirmek istemediğiniz değişkenleri tanımlamanıza izin vermek için.
Bir nesnede serileştirmek / kalıcı hale getirmek istemediğiniz bilgilere (belki de bir üst fabrika nesnesine bir referans) sahip olabilirsiniz veya serileştirmek mantıklı değildir. Bunları 'geçici' olarak işaretlemek, serileştirme mekanizmasının bu alanları yok sayacağı anlamına gelir.
Benim küçük katkım:
Geçici alan nedir?
Temel olarak, transient
anahtar kelimeyle değiştirilen herhangi bir alan geçici bir alandır.
Java'da geçici alanlara neden ihtiyaç duyulur? Anahtar kelime size seri süreci üzerinde bir miktar kontrol sağlar ve bu süreçten bazı nesne özelliklerini çıkarılmasına izin verir. Serileştirme işlemi Java nesnelerini devam ettirmek için kullanılır, böylece durumları aktarılırken veya devre dışı bırakılırken korunabilir. Bazen, bir nesnenin belirli niteliklerini serileştirmemek mantıklıdır. Geçici olarak hangi alanları işaretlemelisiniz?
Şimdi amacını biliyoruztransient
transient
anahtar kelime ve geçici alanlar için, geçici olarak hangi alanların işaretleneceğini bilmek önemlidir. Statik alanlar da serileştirilmediğinden, karşılık gelen anahtar kelime de işe yarayacaktır. Ama bu sınıf tasarımınızı mahvedebilir; transient
anahtar kelimenin kurtarmaya geldiği yer burasıdır . Değerleri başkalarından türetilebilecek alanların serileştirilmesine izin vermemeye çalışıyorum, bu yüzden onları geçici olarak işaretliyorum. interest
Değeri diğer alanlardan ( principal
, rate
& time
) hesaplanabilecek bir alanınız varsa, bunu serileştirmeye gerek yoktur.
Başka bir iyi örnek makale kelime sayımlarıdır. Bir makalenin tamamını kaydediyorsanız, kelime sayısını kaydetmeye gerek yoktur, çünkü makale "serileştirilmiş" hale geldiğinde hesaplanabilir. Veya kaydedicileri düşünün;Logger
Örneklerin neredeyse hiçbir zaman serileştirilmesine gerek yoktur, bu nedenle geçici hale getirilebilirler.
transient
transient
Bir transient
değişken getirilemez olabilecek bir değişkendir.
Bunun akla gelen yararlı olabileceğinin bir örneği, belirli bir nesne örneği bağlamında yalnızca anlamlı olan ve nesneyi serileştirip serileştirdiğinizde geçersiz hale gelen değişkenlerdir. Bu durumda, bu değişkenlerin null
yerine dönüştürülmesi yararlı olur, böylece gerektiğinde bunları yararlı verilerle yeniden başlatabilirsiniz.
transient
sınıf alanının serileştirilmesi gerekmediğini belirtmek için kullanılır. Muhtemelen en iyi örnek bir Thread
alandır. Durumu Thread
çok 'akışa spesifik' olduğundan, a'yı serileştirmek için genellikle bir neden yoktur .
A
başvurular bir değil seri hale getirilebilir sınıf B
(gibi Thread
sizin örnekte), sonra A
sıra ya referansını işaretlemek gerekir transient
makul bir şey yapmak amacıyla XOR varsayılan seri hale getirme işlemini geçersiz kılmalıdır B
sadece seri hale getirilebilir alt sınıfları varsayalım XOR B
aslında başvurulan (bu nedenle gerçek alt sınıf "kötü" üst B
öğelerine dikkat etmelidir) XOR, serileştirmenin başarısız olacağını kabul eder. Sadece bir durumda (geçici olarak işaretlenir) B
otomatik ve sessizce atlanır.
Yerel java dışındaki serileştirme sistemleri de bu değiştiriciyi kullanabilir. Örneğin, hazırda bekletme modu @Transient veya geçici değiştirici ile işaretli alanları sürdürmez . Terracotta da bu değiştiriciye saygı duyar.
Değiştiricinin mecazi anlamının "bu alan sadece bellek içi kullanım içindir. Devam etmeyin veya herhangi bir şekilde bu VM'nin dışına taşımayın. Taşınabilir değil". başka bir VM bellek alanındaki değerine güvenemezsiniz. Çok gibi uçucu araçlarla belirli bellek ve iplik semantik güvenemez.
transient
şu an için tasarlanmış sanki bir anahtar kelimeyi olmaz. Muhtemelen bir ek açıklama kullanırlardı.
Çünkü tüm değişkenler serileştirilebilir nitelikte değildir
Bu soruya cevap vermeden önce, size SERIALİZASYONU açıklamalıyım , çünkü bilim bilgisayarında serileştirmenin ne anlama geldiğini anlarsanız, bu anahtar kelimeyi kolayca anlayabilirsiniz.
Serileştirme
Bir nesne ağ üzerinden aktarıldığında / fiziksel ortama (dosya, ...) kaydedildiğinde, nesnenin "serileştirilmesi" gerekir. Serileştirme bayt durumu nesne serisini dönüştürür. Bu baytlar ağa gönderilir / kaydedilir ve nesne bu baytlardan yeniden oluşturulur.
Misal
public class Foo implements Serializable
{
private String attr1;
private String attr2;
...
}
SİZE DEĞİL yapmak İSTİYORUM Şimdi TRANSFERT / KAYDEDİLDİ Bu nesnenin alanını SO kullanabileceğiniz anahtar kelime transient
private transient attr2;
Serileştirme ile ilgili bazı hassas verileri paylaşmak istemediğinizde gereklidir.
Thread
(örneğin @AH'a kredi) serileştirmek istemezsiniz , bu durumda geçici olarak işaretlersiniz. Bununla birlikte, bir iş parçacığı kendi başına hassas veriler değildir, sadece serileştirmek için mantıklı bir anlam ifade etmez (ve serileştirilemez).
Google kısa süreli anlamı == sadece kısa bir süre süren; süreksiz.
Java'da geçici bir şey yapmak istiyorsanız şimdi geçici anahtar kelime kullanın.
S: Geçici nerede kullanılır?
C: Genellikle java'da verileri değişkenlerde elde ederek ve bu değişkenleri dosyalara yazarak dosyalara kaydedebiliriz, bu işleme Serileştirme adı verilir. Şimdi değişken verilerin dosyaya yazılmasını önlemek istiyorsak, bu değişkeni geçici olarak yaparız.
transient int result=10;
Not: geçici değişkenler yerel olamaz.
Basitçe söylemek gerekirse, geçici java anahtar sözcüğü, geçici olmayan alan sayaç parçaları olarak alanları Serialize'den korur.
Bu kod snippet'inde soyut sınıf BaseJob Serializable arabirimini uygular, BaseJob'dan genişleriz, ancak uzak ve yerel veri kaynaklarını serileştirmemize gerek yoktur; yalnızca organizationName ve isSynced alanlarını serileştirin.
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;
}
}
Geçici anahtar kelime için basitleştirilmiş örnek kod.
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);
}
}
Geçici değiştirici ile bildirilen bir alan, serileştirilmiş sürece katılmayacaktır. Bir nesne serileştirildiğinde (herhangi bir durumda kaydedildiğinde) geçici alanlarının değerleri seri gösterimlerinde yoksayılırken, geçici alanlar dışındaki alan serileştirme işleminde yer alır. Geçici anahtar kelimenin temel amacı budur.
@DoNotSerialize
?