Вопрос: Почему Java имеет переходные поля?


Почему Java преходящий поля?


1181


источник


Ответы:


transientключевое слово в Java используется, чтобы указать, что поле не должно быть сериализовано.

Из Спецификация Java Language, Java SE 7 Edition , Раздел 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сериализуется, а не сохраняется как исходное изображение, так и уменьшенное изображение. Это означает, что для сохранения сериализованного объекта потребуется меньше хранилища. (Конечно, это может быть или не быть желательным в зависимости от требований системы - это просто пример.)

Во время десериализации readObjectметод вызывается для выполнения любых операций, необходимых для восстановления состояния объекта обратно в состояние, в котором произошла сериализация. Здесь миниатюра должна быть сгенерирована, поэтому readObjectметод переопределяется так, что эскиз будет генерироваться путем вызова generateThumbnailметод.

Для получения дополнительной информации Откройте для себя секреты Java Serialization API статья (которая изначально была доступна в Sun Developer Network) содержит раздел, в котором обсуждается использование и сценарий, в котором transientключевое слово используется для предотвращения сериализации определенных полей.


1382



Прежде чем понимать transientключевое слово, нужно понять концепцию сериализации. Если читатель знает о сериализации, пропустите первую точку.

Что такое сериализация?

Сериализация - это процесс постоянного состояния объекта. Это означает, что состояние объекта преобразуется в поток байтов и сохраняется в файле. Таким же образом мы можем использовать десериализацию, чтобы вернуть состояние объекта из байтов. Это одна из важных концепций программирования Java, поскольку сериализация в основном используется в сетевом программировании. Объекты, которые необходимо передать через сеть, должны быть преобразованы в байты. Для этой цели каждый класс или интерфейс должен реализовывать 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, поэтому он не будет храниться в постоянном хранилище.

Источник


343



Чтобы вы могли определять переменные, которые вы не хотите сериализовать.

В объекте у вас может быть информация, которую вы не хотите сериализовать / перенести (возможно, ссылку на родительский заводский объект), или, возможно, это не имеет смысла для сериализации. Помещая их как «переходные», механизм сериализации будет игнорировать эти поля.


78



My small contribution :

What is transient variable in Java?
In simple sentence any variable which is modified with transient keyword becomes transient variable in java.

Why do we need transient variable in java?
Transient keyword provides you some control over serialization process and gives you flexibility to exclude some of object properties from serialization process. Some time it does make sense not to serialize certain attributes of an object, we will see which variables should not be serialized and should be made transient in next section.

Which variable you should mark transient?
Since we know the purpose of transient keyword or having transient variable its make sense to think about which variable should be marked as transient. My rule is that any variable whose value can be calculated from other variables doesn't require to be saved. For example if you have a field called "interest" whose value can be derived from other fields e.g. principle, rate, time etc then there is no need to serialize it.
Another example is of word count, if you are saving article then no need to save word count, because it can be created when article gets deserialized. Another good example of transient keyword is "Logger" since most of the time you have logger instance for logging in Java but you certainly don't want it to serialize correct?


27



A transient variable is a variable that may not be serialized.

One example of when this might be useful that comes to mind is, variables that make only sense in the context of a specific object instance and which become invalid once you have serialized and deserialized the object. In that case it is useful to have those variables become null instead so that you can re-initialize them with useful data when needed.


21



transient is used to indicate that a class field doesn't need to be serialized. Probably the best example is a Thread field. There's usually no reason to serialize a Thread, as its state is very 'flow specific'.


13



Because not all variables are of a serializable nature


10



Serialization systems other than the native java one can also use this modifier. Hibernate, for instance, will not persist fields marked with either @Transient or the transient modifier. Terracotta as well respects this modifier.

I believe the figurative meaning of the modifier is "this field is for in-memory use only. don't persist or move it outside of this particular VM in any way. Its non-portable". i.e. you can't rely on its value in another VM memory space. Much like volatile means you can't rely on certain memory and thread semantics.


10



Serialization is the process of saving an object’s states in a persistent format (such as file stream or database), and later restoring them back from the stream (de-serialization). In Java, an object of a class is serializable if the class implements the java.io.Serializable interface. This is a marker interface which tells the JVM that the class is eligible for serialization.

public class User implements Serializable {

    private static final long serialVersionUID = 1234L;

    private String username;
    private String email;
    private transient String password;
    private Date birthday;
    private int age;

    public User(String username, String email, String password, Date birthday,
            int age) {
        this.username = username;
        this.email = email;
        this.password = password;
        this.birthday = birthday;
        this.age = age;
    }

    public void printInfo() {
        System.out.println("username: " + username);
        System.out.println("email: " + email);
        System.out.println("password: " + password);
        System.out.println("birthday: " + birthday);
        System.out.println("age: " + age);
    }

    // getters and setters

}

There are three important points in this model class: It must implements the Serializable interface. Otherwise, we’ll get a java.io.NotSerializableException when trying to serialize an object of the class. A constant named serialVersionUID is declared and assigned a long value:

private static final long serialVersionUID = 1234L;

This is a conventional constant which should be declared when a class implements the Serializable interface. The serial version UID strongly ensures compatibility between the serialized and de-serialized versions of objects of a class, because the process of serialization and de-serialization can happen on different computers and systems. Although this declaration is optional, it’s always recommended to declare the serialVersionUID for a serializable class.

Notice that the password field is marked as transient:

private transient String password;

Because we don’t want store the password when serializing the object. The rule is, when a variable is marked as transient, its object won’t be serialized during serialization.

A transient variable is a variable that may not be serialized. You use the transient keyword to indicate to the Java virtual machine that the indicated variable is not part of the persistent state of the object.

The access modifiers supported by Java are static, final, abstract, synchronized, native, volatile, transient and strictfp.

Following table gives the list of access specifiers and modifiers Java that can be applied to variables, methods and classes.

SPECIFIER/MODIFIER  LOCAL VARIABLE  INSTANCEVARIABLE    METHOD   CLASS
public              NA              A                   A         A
protected           NA              A                   A         NA
default             A               A                   A         A
private             NA              A                   A         NA
final               A               A                   A         A
static              NA              A                   A         NA
synchronized        NA              NA                  A         NA
native              NA              NA                  A         NA
volatile            NA              A                   NA        NA
transient           NA              A                   NA        NA
strictfp            NA              NA                  A         A

9



Before I respond to this question, I must explain to you the SERIALIZATION, because if you understand what it means serialization in science computer you can easily understand this keyword.

Serialization When an object is transferred through the network / saved on physical media(file,...), the object must be "serialized". Serialization converts byte status object series. These bytes are sent on the network/saved and the object is re-created from these bytes.
Example

public class Foo implements Serializable 
{
 private String attr1;
 private String attr2;
 ...
}

Now IF YOU WANT TO do NOT TRANSFERT/SAVED field of this object SO, you can use keyword transient

private transient attr2;

Example


6



It's needed when you don't want to share some sensitive data that go with serialization.


3



as per google transient meaning == lasting only for a short time; impermanent.

now if want to make anything transient in java use transient keyword.

Q: where to use transient?

A: Generally in java we can save data to files by acquiring them in variables and writing those variables to files, this process is known as Serialization. Now if we want to avoid variable data to be written to file, we would make that variable as transient.

transient int result=10;

Note: transient variables cannot be local.


1