2017-07-14 30 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

一個靜態字段序列化意味着什麼?你序列化*實例*,而不是*類*。想象一下,靜態字段是序列化的:如果它們不是最終的,那麼反序列化一個實例會突然跺腳那些已經存在的值;如果它們是最終的,那麼無論如何你都不能改變它們的值,所以不管它們的值是否相等(爲什麼要序列化它們?)或者它們是不相等的(在這種情況下,你沒有得到你認爲你有的數據)。序列化靜態字段沒有意義。 –

相關問題