Репликация сессий в программировании (Weblogic & Java) - PullRequest
0 голосов
/ 04 февраля 2011

Я хотел бы знать, должен ли объект, вызывающий session.setAttribute или session.getAttribute, также быть необходим для реализации "java.io.Serializable", чтобы поддерживать репликацию сеанса?

например
В классе User реализован интерфейс Serializable.Но если класс SomeUtilityClass, вызывающий "session.setAttribute", необходим для реализации интерфейса Serializable.


/* Does it also need to implement the Serializable here? */
public class SomeUtilityClass{
    public void test(HttpServletRequest request){
        request.getSession().setAttribute("user", new User());
    }
}

public class User implements Serializable{
        private static final long serialVersionUID = 12345432534456654664L;
        //skip the getter & setter...
}

И есть ли проблемы, если переменная serialVersionUID была опущена для репликации сеанса?

спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

Сериализуемыми должны быть только объекты, входящие в сеанс (т. Е. Реализовать этот интерфейс Serializable)

Это означает, что любой объект, заданный в качестве атрибута, плюс любые объекты, содержащиеся в этих объектах.

Итак, если у вас есть класс

public class User implements Serializable {
      private Department department;

// ...
}

, то ваш класс Department также должен реализовать Serializable

Классы, которые просто делают вызовы в сеансе (включаявызовы setAttribute) не должны реализовывать Serializable (включая SomeUtilityClass)

Причина в том, что все, что находится внутри сеанса, должно быть отправлено на другой узел WebLogic (это, вероятно,работает на другом сервере).Это означает, что ему нужно отправить ваш класс User по сети, поэтому он должен иметь возможность превратить ваш класс User в серию байтов, которые он может отправлять, а затем снова превратить его в реальный объект.с другой стороны.

Когда вы реализуете интерфейс Serializable, вы говорите Java, что вы построили свой класс таким образом, что он может превращаться в эти байты (и обратно).Если вы не реализуете Serializable, то Java не знает, нормально ли это делать, так что нет. Примечание : Код для класса не передается, а только значения полей внутри него.Код уже находится на другом узле, потому что это часть вашего приложения, которая уже развернута на всех узлах.

Вашему служебному классу не нужно переходить по сети.Вы не поместили объект этого класса в сеанс, поэтому WebLogic не нужно превращать его в байты (и обратно) в рамках репликации сеанса.
Единственные вещи, которые должны быть Serializable - это объекты, которые помещаются в сеанс либо напрямую (например, User) или косвенно (например, Department пример).
Объектыкоторые просто делают вызовы в сеансе, не должны быть Serializable.

0 голосов
/ 04 февраля 2011

Если ваш служебный класс не имеет состояния, подлежащего репликации между экземплярами сервера, то нет необходимости его сериализации.Что касается serialVersionUID , это целое новое обсуждение само по себе.

...