1663 Stimmen

Warum gibt es in Java transiente Felder?

Warum hat Java transient Felder?

5voto

Mateen Punkte 1614

Laut Google transient meaning == nur für kurze Zeit anhaltend; unbeständig.

Wenn Sie nun etwas in Java vergänglich machen wollen, verwenden Sie das Schlüsselwort transient.

F: Wo kann man die Übergangszeit nutzen?

A: Im Allgemeinen können wir in Java Daten in Dateien speichern, indem wir sie in Variablen erfassen und diese Variablen in Dateien schreiben; dieser Prozess wird als Serialisierung bezeichnet. Wenn wir nun vermeiden wollen, dass Variablendaten in eine Datei geschrieben werden, müssen wir die Variable als transient kennzeichnen.

transient int result=10;

Anmerkung: transiente Variablen können nicht lokal sein.

2voto

Yu Jiaao Punkte 4014

Denn nicht alle Variablen sind serialisierbar.

  1. Serialisierung und Deserialisierung sind Symmetrieprozesse, andernfalls kann man nicht erwarten, dass das Ergebnis bestimmt ist, in den meisten Fällen sind unbestimmte Werte bedeutungslos;
  2. Serialisierung und Deserialisierung sind idempotent, d.h. Sie können die Serialisierung so oft durchführen, wie Sie wollen, und das Ergebnis ist das gleiche.

Wenn das Objekt also im Speicher, aber nicht auf der Festplatte existiert, kann das Objekt nicht serialisiert werden, da die Maschine bei der Deserialisierung die Memory Map nicht wiederherstellen kann. Zum Beispiel können Sie nicht serialisieren ein Stream Objekt.

Sie können keine Serialisierung einer Connection Objekt, da sein Zustand auch von der Gegenstelle abhängt.

1voto

Mohammed H Punkte 6558

Vereinfachter Beispielcode für transient-keyword.

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);
    }
}

0voto

nyulan Punkte 311

Einfach ausgedrückt, schützt das transiente Java-Schlüsselwort Felder vor dem Serialisieren wie ihre nicht-transienten Gegenstücke.

In diesem Codeschnipsel implementiert unsere abstrakte Klasse BaseJob die Schnittstelle Serializable. Wir erweitern von BaseJob, aber wir müssen die entfernten und lokalen Datenquellen nicht serialisieren; wir serialisieren nur die Felder organizationName und isSynced.

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;

   }
}

0voto

Vishal Sheth Punkte 143

Ein Feld, das mit einem transienten Modifikator deklariert wird, nimmt nicht am Serialisierungsprozess teil. Wenn ein Objekt serialisiert (in einem beliebigen Zustand gespeichert) wird, werden die Werte seiner transienten Felder in der seriellen Darstellung ignoriert, während andere Felder als transiente Felder am Serialisierungsprozess beteiligt sind. Das ist der Hauptzweck des Schlüsselworts transient.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X