2009-03-23 2 views
1

Есть ли способ отключить кеширование сериализованного объекта в Java?Отключить кеширование сериализации

У меня есть такой сценарий:

  1. У меня есть объект, который Сериализуемый, я сериализации, десериализации его значения в порядке.
  2. На том же объекте я меняю какое-то значение, я его сериализую, десериализую его, значения НЕ ОК, значения такие же, как и первоначально загруженные.

Похоже, что сериализатор кэширует значения, или нет?

Благодаря

скопировал этот пример из "Фредрик" и принял к моему делу:

public class SerialDeserial { 
    public static void main(String[] args) { 
     try { 
      ChangingObject obj = new ChangingObject(); 
      obj.foo=1; 
      // Write it 
      ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("test.foo")); 
      os.writeObject(obj); 
      os.flush();os.close(); 

      // Read the object 
      ObjectInputStream is = new ObjectInputStream(new FileInputStream("test.foo")); 
      ChangingObject objDummy = (ChangingObject)is.readObject(); 
      System.out.println("objDummy.foo is "+objDummy.foo); 

      // Change it 
      obj.foo=2; 
      // Write it 
      os = new ObjectOutputStream(new FileOutputStream("test.foo")); 
      os.writeObject(obj); 
      os.flush();os.close(); 

      // Read the object 
      is = new ObjectInputStream(new FileInputStream("test.foo")); 
      objDummy = (ChangingObject)is.readObject(); 
      System.out.println("objDummy.foo is "+objDummy.foo); // this returns "1" insted of "2" 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class ChangingObject implements Serializable { 
    public int foo; 
} 

ответ

5

ObjectOutputStream.reset.

Вы также можете написать объект с writeUnshared, но это мелкие объекты, на которые ссылаются объекты, по-прежнему будут совместно использоваться.

Конечно, неизменные объекты - это победа, как обычно.

+0

Согласитесь, но он говорит, что получает ошибку даже с исходным источником образца, а затем это новый поток, и он не должен иметь никакого состояния. – Fredrik

+0

Возможно, вы слишком буквальны, хотя я не знаю, была ли ошибка в выходной или входной стороне вещей. –

-1

Serializer не имеет кэш-память.

Вы должны показать минимальный пример того, как повторить случай.

0

stepancheg прав, вы уверены, что не перечитываете первый сериализованный объект?

Следующий образец работает. Если вы можете создать нечто подобное, чего нет, отправьте его здесь. импорт java.io. *;

public class SerialDeserial { 
    public static void main(String[] args) { 
    try { 
     ChangingObject obj = new ChangingObject(); 
     obj.foo=1; 
     // Write it 
     ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("test.foo")); 
     os.writeObject(obj); 
     os.flush();os.close(); 

     // Read the object 
     ObjectInputStream is = new ObjectInputStream(new FileInputStream("test.foo")); 
     obj = (ChangingObject)is.readObject(); 
     System.out.println("obj.foo is "+obj.foo); 

     // Change it 
     obj.foo=2; 
     // Write it 
     os = new ObjectOutputStream(new FileOutputStream("test.foo")); 
     os.writeObject(obj); 
     os.flush();os.close(); 

     // Read the object 
     is = new ObjectInputStream(new FileInputStream("test.foo")); 
     obj = (ChangingObject)is.readObject(); 
     System.out.println("obj.foo is "+obj.foo); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

class ChangingObject implements Serializable { 
    public int foo; 
} 

Edit: Если я ваш измененный пример (ну, на самом деле не) я до сих пор получить правильный результат (с 2, а не как второй выход). Вы предлагаете сбросить настройки, не должны иметь никакого значения, поскольку вы снова открываете файл и начинаете с самого начала как при чтении, так и при записи. Я думаю, что ваши проблемы лежат где-то в другом месте (какая ОС вы используете?), Какая файловая система? И т. Д.) Он должен просто работать, извините.

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