2016-09-19 71 views
0

我已经创建了一个名为“Item”的对象,我想用序列化一个ArrayList里面的Items。我的程序完美适用于ArrayList<String>,但它不适用于ArrayList<Item>。我相信这与我的对象有关。这是它:序列化Arraylist <CustomObject>

public class Item implements Serializable{ 

private static String name; 
private static BufferedImage picture; 
private static boolean craftable; 
private static Item[][] craftTable; 
private static boolean smeltable; 
private static Item smelt_ancestor; 
private static Item smelt_descendant; 

public Item(String name, boolean craftable, boolean smeltable){ 
    this.name = name; 
    this.craftable = craftable; 
    if(craftable){ 
     craftTable = new Item[3][3]; 
    }else{ 
     craftTable = null; 
    } 
    this.picture = null; 
    this.smeltable = smeltable; 
    this.smelt_ancestor = null; 
    this.smelt_descendant = null; 
} 

public String getName(){ 
    return name; 
} 

public void setName(String name){ 
    this.name=name; 
} 

public BufferedImage getPicture(){ 
    return picture; 
} 

public boolean setPicture(){ 
    boolean verify = false; 
    String pictureName = name.replaceAll("\\s+",""); 
    String newNamePng = pictureName + ".png"; 
    String newNameJpg = pictureName + ".jpg"; 
    File imagePng = new File(newNamePng); 
    File imageJpg = new File(newNameJpg); 
    if(imagePng.exists()){ 
     return true; 
    }else if(imageJpg.exists()){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

public boolean getCraftable(){ 
    return craftable; 
} 

public void setCraftable(boolean value){ 

    this.craftable = value; 
} 

public boolean setCraftTable(Item[][] table){ 
    if(this.craftable==true){ 
     craftTable = table; 
     return true; 
    }else{ 
     return false; 
    } 

} 

public Item[][] getCraftTable(){ 
    return craftTable; 
} 

public boolean getSmeltable(){ 
    return smeltable; 
} 

public void setSmeltable(boolean value){ 
    smeltable = value; 
} 

public Item getAncestor(){ 
    return smelt_ancestor; 
} 

public void setAncestor(Item ancestor){ 
    smelt_ancestor = ancestor; 
} 

public Item getDescendant(){ 
    return smelt_descendant; 
} 

public void setDescendant(Item des){ 
    smelt_descendant = des; 
} 

public String toString(){ 
    return name; 
} 

忽略进口,我用他们在其他方法我省略,因为他们工作完美。对象有什么问题可以阻止它被正确序列化?

+3

所有的字段都是静态的。了解这意味着什么。这是没有意义的。 https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html –

回答

2

静态变量不会被序列化。它看起来像你可能希望那些是非静态的实例变量。

+0

你是对的,谢谢!我仍然在学习:D –

0

按定义的序列化应用于对象而不是类。 它复制要通过网络或流传输或要存储的对象的状态。 您对静态变量的使用使它们成为类变量,因此它们不会影响对象的状态。首先要做的就是让它们变成非静态的。

这给我们留下了你的类,它已经是Serializable了,ArrayList也是如此。您可以使用ObjectInputStream和ObjectOutputStream对它们进行序列化和反序列化,并确保在反序列化结束时在类路径中具有相同的类。