我想知道如何对包含文件中的staic属性的类进行deserilize,因为当我从project创建一个实例时,我不能影响它到全局类
我的代码:(反序列化方法不起作用)
public class Project implements Serializable{
private static String name;
private static String site;
private static Table table;
public static String getName() {
return Project.name;
}
public static void setName(String name) {
Project.name = name;
}
public static String getSite() {
return Project.site;
}
public static void setSite(String site) {
Project.site = site;
}
public static Table getTable() {
return Project.table;
}
public static void setTable(Table table) {
Project.table = table;
}
// Serialize
public static boolean serialize(String path){
try{
FileOutputStream fout = new FileOutputStream(path);
Crypto.encrypt(Project.class, fout);
return true;
}catch(Exception ex){
return false;
}
}
public static boolean deserialze(String path){
try{
FileInputStream fin = new FileInputStream(path);
Project project = (Project) Crypto.decrypt(fin);// decrypt file
Project.name = project.getName();
Project.site = project.getSite();
Project.table = project.getTable();
return true;
}catch(Exception ex){
return false;
}
答案 0 :(得分:0)
如果您要实施java.io.Serializable
界面,请记住,当您反序列化transient
或静态fields
时,他们很可能会有默认值(对象类型为null)。
如果范围中没有对象,静态字段也会获得默认值(否则,它将使用为现有对象定义的值进行初始化)。
答案 1 :(得分:0)
序列化适用于对象 - 类的实例。但static
字段不是实例的一部分。因此序列化不会触及它们。
但您实际上并没有序列化Project
类的实例。您正在序列化类对象本身,它是java.lang.Class
类的一个实例。我可以看到为什么你认为可能会存储你的静态字段,但事实并非如此:一个类对象用于reflection,获取关于类的信息。它实际上并不包含类的数据;类中的静态字段不是Project.class
对象的字段。 AFAIK,序列化一个类对象通常不是一件有用的事情。
无论如何,您的字段看起来可能不应该是static
,因为它们保存的信息对于每个项目都应该是不同的。现在,您有一个名称,该名称在所有项目,单个站点和单个表中共享。您可以运行new Project()
五十次并拥有五十个不同的对象,但是没有办法让它们彼此不同。您的程序无法表示具有不同名称的两个项目。
我的建议:取出所有static
个关键字,将静态字段引用(例如Project.name
)更改为实例字段引用(例如this.name
),创建类的实例(例如Project project = new Project()
)并设置其字段,并序列化 。