2017-07-14 28 views
0

可再现例如:为什么此序列化逻辑失败,并声明'不匹配的可序列化字段'?

package test; 

import java.io.FileOutputStream; 
import java.io.ObjectOutputStream; 
import java.io.ObjectStreamField; 
import java.io.Serializable; 


public class mySerializable implements Serializable { 

    private static int f; 
    private static int g; 

    private static final ObjectStreamField[] serialPersistentFields = { 
      new ObjectStreamField("f", Integer.class), 
      new ObjectStreamField("g", Integer.class), 
    }; 

    public static void main(String[] args) { 

     save(); 

    } 
    public static void save() { 
     try { 
      FileOutputStream fileOut = new FileOutputStream("config" + ".ser"); 
      ObjectOutputStream out = new ObjectOutputStream(fileOut); 
      out.writeObject(new mySerializable()); 
      out.close(); 
      fileOut.close(); 
     } catch (Exception ex) { 
      System.out.println("save()" + ex.getLocalizedMessage());  } 
    } 
    public static int getF() { 
     return f; 
    } 
    public static void setF(int f) { 
     mySerializable.f = f; 
    } 
    public static int getG() { 
     return g; 
    } 
    public static void setG(int g) { 
     mySerializable.g = g; 
    } 
} 

该程序打印: 节省():test.mySerializable;无与伦比的序列化字段(S)宣布

+0

'F'和'g'是静态的。 –

+0

@AndyTurner这就是ObjectStreamField的意义所在:我不正确地使用它吗? – nicomp

+0

'static'和'Serializable'是两个完全不同的东西。在一天结束时,因为你没有实例变量,所以没有什么可以序列化的。 –

回答

1

你有两个问题:

  • fgstatic;静态字段不会被序列化。
  • 他们也是类型int,而不是Integer

使它们成为非静态的,并使用int.class来引用它们。

Ideone demo

+0

是不是ObjectStreamField数组允许静态属性被序列化的点? – nicomp

+0

一个静态字段序列化意味着什么?你序列化*实例*,而不是*类*。想象一下,静态字段是序列化的:如果它们不是最终的,那么反序列化一个实例会突然跺脚那些已经存在的值;如果它们是最终的,那么无论如何你都不能改变它们的值,所以不管它们的值是否相等(为什么要序列化它们?)或者它们是不相等的(在这种情况下,你没有得到你认为你有的数据)。序列化静态字段没有意义。 –