gpt4 book ai didi

java - 为什么我的 "marshaller"必须是 "static"?

转载 作者:行者123 更新时间:2023-11-30 02:35:52 25 4
gpt4 key购买 nike

我正在尝试在对象自己的类中“编码”和“解编”对象,并使用“编码器”。

主要方法:

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

这是编码员:

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.NotSerializedException。为什么?

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

祝你有美好的一天。

PS:我应该使用“marshall”这个词还是“serialize”这个词吗?

最佳答案

当您序列化一个对象时,所有可从该对象访问的对象也会被存储,因此所有这些对象都必须是可序列化的。如果你声明你的类如下:

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 的任何实例的可访问字段为 valuefilemarshaller,因此 jvm 将尝试序列化它们,这要求它们都必须是可序列化的,但类 Marshaller 不是,那么就会发生异常。

当你将一个字段声明为static时,你就让它成为类的成员,而不是单个实例,因为序列化只关心实例的当前状态,只有与特定实例关联的数据才会被序列化,因此所有静态字段都将被忽略,并且您的程序可以正常工作。

如果您确实需要某个字段作为实例成员,但又不希望其被序列化,则需要使用关键字transient声明它,那么在序列化过程中它将被忽略。

对于单词 marshallserialize,我不是以英语为母语的人,所以我无法过多地讲述它们之间的区别,但就我个人而言,我在这种情况下,更喜欢使用 serialize,并在与 Java 对象处理 JSON/XML 时使用 marshall

希望这对您有帮助:-)

关于java - 为什么我的 "marshaller"必须是 "static"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43094822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com