2014-12-29 3 views
2

Я работаю с ObjectOutputStream, чтобы сохранить объект в файле .dat. Моя проблема заключается в том, что если я ИЗМЕНИТЬ исходный код моего объекта (например, я добавляю метод ONE (getter)) входной поток не может загрузить данные и сообщить мне об ошибке Serializable: Можно решить эту проблему? Я должен генерировать новый файл .dat каждый раз после того, как я изменю свой исходный код.ObjectOutputStream/Input Serializable in JAVA

С помощью этого метода: (не смотрит на объект значение типа обратного) СОХРАНИТЬ

public void saveToFile(HeaderOfMapTeachStructure hm, String nameOfFile) { 
    try (ObjectOutputStream os = new ObjectOutputStream(
      new FileOutputStream(nameOfFile + "." + this.TYPE_OF_FILE))) { 
     os.writeObject(hm); 
    } catch (IOException e) { 
     System.out.println("Error: " + e); 
    } 
} 

НАГРУЗКА

public MapStandard loadFromFileMS(String nameOfFile) { 
    MapStandard hm = null; 
    InputStream inputStreaminputStream 
      = getClass().getClassLoader(). 
      getResourceAsStream("data/" + nameOfFile + ".data"); 
    try { 
     try (ObjectInputStream is = new ObjectInputStream(inputStreaminputStream)) { 
      hm = (MapStandard) is.readObject(); 
     } 
    } catch (IOException | ClassNotFoundException e) { 
     System.out.println("Error: " + e); 
    } 
    return hm; 
} 

ошибка:

Error: java.io.InvalidClassException: MapVerb.RealVerb; local class incompatible: stream classdesc serialVersionUID = -887510662644221872, local class serialVersionUID = 7992494764692933500 
+1

Какая ошибка? – gimpycpu

ответ

5

Можно решить эту проблему?

Да. Причина разрыва сериализации заключается в том, что сгенерированный номер версии изменяется. Если вы укажете это явно, оно не будет сгенерировано, и вы будете контролировать управление версиями. Это означает, что вам нужно быть осторожным - если вы измените поля, которые находятся в объекте, или , что означает этих полей, вам нужно будет запомнить номер версии самостоятельно.

Вы указываете версию сериализации так:

// It doesn't have to be constant, but that's fairly common. 
private static final long serialVersionUID = ...; // Some constant 

Смотрите документацию по Serializable для получения дополнительной информации.

Возможно, вы также захотите рассмотреть альтернативные подходы к хранению данных - двоичная сериализация по умолчанию в Java довольно хрупкая. Существует множество альтернатив - текстовые форматы, такие как XML, JSON или YAML, или двоичные форматы, такие как протокольные буферы или Thrift.

+0

Спасибо ... За ваш ответ и помощь. – staigoun

Смежные вопросы