我正试图"马歇尔"和#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:我应该使用marshall
或serialize
这个词吗?
答案 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();
}
然后来自Something
类value
,file
和marshaller
的任何实例的可到达字段都是serializable
,Marshaller
和static
,因此jvm也会尝试将它们序列化,这需要每个必须是transient
,但类marshall
不是,然后发生异常。
当您将字段声明为serialize
时,您将其设为类的成员,而不是单个实例,因为序列化仅关注实例的当前状态,只有与特定实例关联的数据才会被加强,因此,所有静态字段都将被忽略,您的程序可以正常工作。
如果您确实需要字段为实例成员但不希望将其序列化,则需要使用关键字serialize
声明它,然后在序列化期间忽略它。< / p>
对于单词marshall
和let myClass =
,我不是母语为英语的人,所以我不能过多地讲述他们之间的区别,但我个人更喜欢{在这种情况下,{1}}在从/向Java对象处理JSON / XML时使用class
。
希望这对你有所帮助: - )