2013-08-07 47 views
0

我得到這個錯誤,當我運行程序:invalidClassException:請幫忙收到這些錯誤

java.io.InvalidClassException: Food; local class incompatible: stream classdesc serialVersionUID = -1986042743597353721, local class serialVersionUID = -2452322360924937818 
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:570) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1599) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1494) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1599) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1494) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1748) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327) 
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1683) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1321) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349) 
    at GroceryStore.readInventory(GroceryStore.java:16) 
    at GroceryStore.main(GroceryStore.java:39) 

我嘗試了很多事情,但真的不知道在那裏我去錯了,即時通訊新的這個東西。

import java.io.Serializable; 

    public abstract class Food implements Serializable { 
    String Type, Name; 
    double Price; 
    private static final long serialVersionUID = -2452322360924937818L; 

    public Food(String Type, String Name, double Price){ 
      this.Type = Type; 
     this.Name = Name; 
     this.Price = Price; 
    } 
    public String getType(){ 
     return Type; 
    } 
    public String getName(){ 
     return Name; 
    } 
    public double getPrice(){ 
     return Price; 
    } 
    public String toString(){ 
     return (Type + " " + Name + " " + Price); 
    } 
    public abstract double getQuantity(); 
} 



    import java.io.Serializable; 

    public class FoodItem extends Food implements Serializable { 

    private static final long serialVersionUID = -2452322360924937818L; 
    private double quantity; 
    int bestBeforeMonth; 
    int bestBeforeDay; 


    public FoodItem(String Type, String Name, double Price, double quantity, int  bestBeforeMonth, int bestBeforeDay) { 
     super(Type, Name, Price); 
     this.quantity = quantity; 
     this.bestBeforeDay = bestBeforeDay; 
     this.bestBeforeMonth = bestBeforeMonth; 
    } 


    @Override 
    public double getQuantity() { 
     return quantity; 
    } 
    public void removeQuantity(double quantity){ 
     this.quantity = this.quantity - quantity; 
    } 

    } 


    import java.io.FileInputStream; 
    import java.io.FileNotFoundException; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.ObjectInputStream; 
    import java.io.ObjectInputStream.GetField; 
    import java.io.ObjectOutputStream; 


    public class GroceryStore { 
    static FoodItem[] inventory = null; 
    public static void readInventory(){ 

    try { 
     ObjectInputStream in = new ObjectInputStream(new FileInputStream("grocery.bin")); 
     inventory[0] = (FoodItem) in.readObject(); 



    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    } 

public static void main(String[] args){ 
    readInventory(); 
} 
} 

回答

1

此消息是由於類的序列化版本與當前類之間的版本不匹配而引起的。

消息說您已使用對象流序列化的類的版本號爲-1986042743597353721,但是您的類版本ID爲-2452322360924937818L

所以,你有2種選擇:

  • 獲取與串行版本ID -1986042743597353721類,或...
  • 編寫一個瞭解舊格式和 可以構造一個新的對象的自定義解串器。

Here是完整的文檔。

+0

假設我想和-1986042743597353721一起上課,我該如何去做? –

0

可能是你的文件「grocery.bin」與從Food.class用的serialVersionUID = -1986042743597353721創建食品的對象填充,你想它的serialVersionUID = -2452322360924937818

首先轉換爲Food.class我會嘗試將您實施的類的serialVersionUID更改爲-1986042743597353721。

如果出現其他相關異常,那麼與序列化對象和您的類存在實際差異。在這種情況下,您應該瞭解創建grocery.bin的人或者什麼,並克隆它的Food.java類。

+0

我應該在哪裏改變它?在食物類?或FoodItem類?並且這是怎麼做的private static final serialVersionUID = -1986042743597353721L; –

+0

食物類,抽象類。是的,這是做到這一點的方法。 – curyfernando

+0

我試過了,現在得到了這個錯誤。 java.io.InvalidClassException:FoodItem;本地類不兼容:流類classdesc serialVersionUID = -2452322360924937818,本地類serialVersionUID = 1140335404112415784 –

相關問題