如何影响具有静态属性的类

时间:2015-07-14 23:19:21

标签: java

我想知道如何对包含文件中的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;

       } 

2 个答案:

答案 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())并设置其字段,并序列化