2013-08-07 44 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 –

相关问题