在序列化Java标准类时,LocalClassIncompatible

时间:2014-04-30 10:40:28

标签: java serialization

我在使用生成的SerialVersionUID序列化自定义可序列化对象时遇到问题,因为在尝试使用以下错误反序列化此objetc时出现InvalidClassException:

  

< com.assistantindustries.test.Prueba;本地类不兼容:   stream classdesc serialVersionUID = 6090585534595974753,本地类   serialVersionUID = 6090585536173033057>

我做了一个junit类来测试它,这个错误不断发生。这是测试的代码:

public class TestSerializacion {

   public String pruebaToString(Serializable prueba){
       ByteArrayOutputStream bs= new ByteArrayOutputStream();
       ObjectOutputStream os = null;
    try {
        os = new ObjectOutputStream (bs);
        os.writeObject(prueba);
        os.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
       return bs.toString();
   }

   public static Prueba getPruebaFromString(String prueba){
       ByteArrayInputStream bs= new ByteArrayInputStream(prueba.getBytes());
       ObjectInputStream is = null;
       Prueba unObjetoSerializable = null;
    try {
        is = new ObjectInputStream(bs);
        unObjetoSerializable = (Prueba)is.readObject();
        is.close();
    } catch (ClassNotFoundException | IOException e1) {
        e1.printStackTrace();
    }
       return unObjetoSerializable;
   }

   @Test
   public void testBasico(){
       int i=453;
       Prueba prueba=new Prueba(i);
       String toSend=pruebaToString(prueba);
       Prueba recibida=getPruebaFromString(toSend);
       assertEquals(prueba.getPhrase(),recibida.getPhrase());
   }

}

和班级:

public class Prueba implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 6090585536173033057L;
ArrayList<String> texts;

public Prueba(int semilla) {
    Random r=new Random(semilla);
    this.texts = new ArrayList<String>();
    for (int i = 0; i < 100; i++) {
        char[] palabra=new char[10];
        for (int j = 0; j < palabra.length; j++) {
           palabra[j]=(char) (r.nextInt(256));
        }
        texts.add(new String(palabra));
    }
}

public synchronized ArrayList<String> getTexts() {
    return texts;
}

public synchronized void setTexts(ArrayList<String> texts) {
    this.texts = texts;
}

public String getPhrase(){
    String total="";
    for(String s:this.texts){
        total.concat(s);
    }
    return total;
}

}

我发现有关类似问题的所有答案都是通过定义serialVersionUID来解决的,但它已在此类中定义 任何帮助将不胜感激!提前谢谢!

1 个答案:

答案 0 :(得分:1)

在我之后重复。 String不是二进制数据的容器。写出100次。您不应该将序列化结果转换为String。又回来了。将其作为byte[]数组传递。