关于java:为什么我的“marshaller”必须是“静态的”?

Why does my “marshaller” have to be “static”?

我试图在自己的类中"marshall"和"unmarshall"对象,并使用"marshaller"。

主要方法:

1
2
3
4
5
6
public class Main {

    public static void main(String[] args) {
        new Something();        
    }
}

将向马歇尔或unmarshall提供实例的"某物"类应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.File;
import java.io.Serializable;

public class Something implements Serializable {

    /**
     *
     */

    private static final long serialVersionUID = 1L;
    public int value = 2;
    private File file = new File("something.serial");
    private static Marshaller marshaller = new Marshaller();

    Something() {

        value = 3;
        marshaller.marshalling(file, this);
        Something anotherThing = (Something) marshaller.unmarshalling(file);
        System.out.println(anotherThing.value);
    }
}

这里是元帅:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Marshaller {

    public Marshaller() {

}

    /**
     * Charge l'objet sérializé d'un fichier si il existe
     * @param file : le fichier à désérialiser
     * @return obj : l'instance d'objet désérialisé
     */

    public Object unmarshalling(File file) {
        Object obj = null;
        ObjectInputStream ois;
        try {
            BufferedInputStream bis = new BufferedInputStream(
            new FileInputStream(file));
            ois = new ObjectInputStream(bis);
            obj = ois.readObject();
            ois.close();
        } catch(FileNotFoundException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        }
        return obj;
    }

    /**
     * Permet d'enregistrer un objet (settings, client...) dans un fichier
     * @param file : le fichier support de la sérialisation
     * @param obj : l'instance d'objet à sérialiser
     *
     */

    public void marshalling(File file, Object obj) {
        ObjectOutputStream oos;
        try {
            oos = new ObjectOutputStream(
            new BufferedOutputStream(
            new FileOutputStream(file)));
            oos.writeObject(obj);
            oos.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

Something类中,如果我的元帅没有被声明为"static",我会得到一个java.io.NotSerializableException。为什么?

谢谢你的回答帮助我理解。

祝您今天过得愉快。

附:我应该用"EDOCX1"〔2〕或"EDOCX1"〔3〕这个词吗?


当你序列化对象,所有的对象是从一个到达的对象存储为好,所以他们都必须serializable。如果你声明你的类的类。

1
2
3
4
5
6
public class Something implements Serializable {
    private static final long serialVersionUID = 1L;
    public int value = 2;
    private File file = new File("something.serial");
    private Marshaller marshaller = new Marshaller();
}

然后到达机场或从任何一类的SomethingvaluefilemarshallerJVM,那么他们想尝试序列化为好,这需要每个人必须serializable是一流的,但marshaller,然后异常的发生。

当你声明一个static场,让它在你的类的成员,因为它需要的个人,serialization只关心当前的状态数据的一个实例,只有相关的特异性可能会serilized静态场,因此所有的作品被忽略和你的计划是好的。

如果你需要一个场的实例,但不想做serialized,你需要将它transient关键字,那么它将被忽略,往往在serialization。

和Word marshallserialize,我不是一个英语演讲,所以我不能告诉太多关于他们个人之间的差异,但我喜欢serialize本案例中,在处理和使用的marshall从/到Java/XML的JSON对象。

希望这可以帮助你:-)