2015-04-17 3 views
3

У меня есть иерархия классов java следующим образом.Частично десериализация сложного Java-объекта

public class Results{ 
    private String _query; 
    private CachedRowSetImpl _resultSet; 
    //... getter setters 
} 

Я сериализованная List<Results> resultList, рассмотрит этот список содержит 100 наименований и каждый _resultSet, имеющий более чем 1000 записей. У меня есть 2 вопроса,

  1. Когда мы десериализуем этот объект, моя память приложения будет содержать весь объект и будет ли он создавать проблему с размером кучи?
  2. Если это создаст проблему с ресурсами, когда я десериализую, могу ли я игнорировать _resultSet, являясь десериализованным значением, достаточно просто запроса?

Исправьте меня, если мое понимание ошибочно.

+1

Вы можете реализовать 'Externalizable' и использовать его' 'readExternal' и writeExternal' соответственно –

+0

Если вы можете игнорировать' _resultSet' в то время как десериализация, зачем сериализовать его? Просто сделайте это «переходным». –

+1

Это зависит от вашего требования, что вы должны игнорировать '_resultSet' или нет. если вам нужно игнорировать, то, как было предложено @SashiKant, вы можете использовать 'Externalizable' для своего собственного метода« сериализации »и« десериализации ». или просто вы можете сделать эту переменную ** переходной **. – Prashant

ответ

1

Если вы реализуете Externalizable, ваш readExternal будет выглядеть примерно так:

 public void readExternal(ObjectInput in) throws IOException, 
     ClassNotFoundException { 
      _query=(String) in.readObject(); 
      if(//yourCondition){ 
      _resultSet=(CachedRowSetImpl) in.readObject(); 
      } 
     } 
+0

Я поражен тем, как это сделать, когда будет вызываться 'serializeObjectInputStream.readObject()' 'readExternal', тогда будет создан только новый объект' Results', где я могу дать значение для проверки, как вы упомянули, в ' // yourCondition', если возможно, вы можете дать представление.? –

+0

Получил это, я попробую 'StackTraceElement []' и дам вам знать. Спасибо .. –

+0

@Pasupathi: Отлично, что это помогло :) –

0

Вы должны реализовать Serializable. Модификатор «переходный» может использоваться для игнорирования полей во время сериализации. Я не знаю, что содержится в CachedRowSetImpl, но когда вы игнорируете это, тогда только 100 объектов String вряд ли вызовут проблему кучи.

public class Results implements Serializable{ 
    private String _query; 
    private transient CachedRowSetImpl _resultSet; 
    //... getter setters 
} 
+0

OP всегда не хочет игнорировать это, он должен быть условным на основе размера набора результатов –

+0

Мне нужно _resultSet в одном процессе, а не в другом процессе. Так что, как сказал Саши Кант, «временный» мне не поможет. –

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