Serializable в java

352
28 июля 2017, 00:34

Привет! У меня есть вопрос по Java. Почему модификатор типу transient в примере не обнуляет String a = null.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializeDog implements Serializable {
    private String a;
    private transient String b;
    public SerializeDog(String aa,String bb) {
        a = "Not announced as transient : " + aa;
        b = "Announced as transient : " + bb;
    }
    public String toString(){return a + "\n" + b;}
    private void writeObject(ObjectOutputStream stream) throws IOException {
        stream.defaultWriteObject();
        stream.writeObject(b);
    }
    private void readObject(ObjectInputStream stream) throws IOException,ClassNotFoundException {
    stream.defaultReadObject();
    b = (String)stream.readObject();
    }
    public static void main(String[] args) throws IOException,ClassNotFoundException {
    SerializeDog sd = new SerializeDog("paper 1", "paper 2");
    System.out.println("before : " + sd);
    ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("File"));
    o.writeObject(sd);
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("File"));
    SerializeDog sd2 = (SerializeDog)in.readObject();
    System.out.println("after : " + sd2);
    }
}

и результат вот:

before : Not announced as transient : paper 1
Announced as transient : paper 2
after : Not announced as transient : paper 1
Announced as transient : paper 2
Answer 1

Поля, которые помечены ключевым словом transient не сериализуются в том случае, если используеся метод записи по умолчанию. Если мы заглянем в исходный код класса ObjectStreamClass и найдём метод getDefaultSerialFields, который возвращает набор полей класса для сериализации, то увидим, что в нём игнорируются статические поля и поля, помеченные как transient.

Однако вы сами записываете и читаете значение из поля b в собственных реализациях методов writeObject и readObject - в этом случае ключевое слово transient никак не учитывается.

READ ALSO
Размеры диалогового окна (JDialog)

Размеры диалогового окна (JDialog)

Существует jframe с двумя button (button1, button2) по нажатию на любой из button открывается jdialog в котором находятся две jpanel (jpanel1, jpanel2)

384
markdown to Html ReactJs

markdown to Html ReactJs

Как в ReactJs Маркдаун перевести в HTML?

263
Как подключить css,js,картинки к node.js

Как подключить css,js,картинки к node.js

Здравствуйте,у меня проблема : Пытаюсь подключить css, js файлы и картинки к nodejs с помощью require , но он выдает ошибку при чтении css / js файлов (менял...

340