为什么我的" marshaller"必须是"静态"?

时间:2017-03-29 13:23:35

标签: java serialization deserialization marshalling unmarshalling

我正试图"马歇尔"和#34; unmarshall"对象,在他们自己的班级中,并使用" Marshaller"。

主要方法:

public class Main {

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

" Something"将生成实例以进行编组或解组的类:

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

这是Marshaller:

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中,如果我的Marshaller未被宣布"静态",我会得到java.io.NotSerializableException。为什么?

感谢您的回答,帮助我理解。

祝你有个美好的一天。

PS:我应该使用marshallserialize这个词吗?

1 个答案:

答案 0 :(得分:2)

序列化对象时,也会存储从该对象可以访问的所有对象,因此所有这些对象都必须为serializable。如果你宣布你的班级如下:

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

然后来自Somethingvaluefilemarshaller的任何实例的可到达字段都是serializableMarshallerstatic,因此jvm也会尝试将它们序列化,这需要每个必须是transient,但类marshall不是,然后发生异常。

当您将字段声明为serialize时,您将其设为类的成员,而不是单个实例,因为序列化仅关注实例的当前状态,只有与特定实例关联的数据才会被加强,因此,所有静态字段都将被忽略,您的程序可以正常工作。

如果您确实需要字段为实例成员但不希望将其序列化,则需要使用关键字serialize声明它,然后在序列化期间忽略它。< / p>

对于单词marshalllet myClass =,我不是母语为英语的人,所以我不能过多地讲述他们之间的区别,但我个人更喜欢{在这种情况下,{1}}在从/向Java对象处理JSON / XML时使用class

希望这对你有所帮助: - )