2014-09-17 4 views
0

У меня есть классы с переходными переменных, внутренних классов и перечислений, как:GlassFish 4 десериализации бросает NullPointerException

public class TestClass { 
    enum MyEnum { ABC, DEF } 
    MyEnum myEnum = MyEnum.ABC; 
    transient String str = "Some Text"; 
    ... } 

Вызов удаленного метода в GlassFish 4 или получить этот класс в качестве ответа

System.out.println("myEnum=" + testClass.myEnum); 

будет print null

Я ожидаю, что десериализация создаст новый экземпляр этого класса (например, вызывает newInstance()). Та же проблема существует с внутренними классами и переходными переменными, которые должны быть инициализированы во время создания экземпляра.

С другой стороны, трудно поверить, что я первый, кто это узнал. Я думаю здесь не в том направлении?

+0

В чем смысл маркировки переходного процесса? – unwichtich

+0

Потому что не имеет смысла настаивать на этом или отправлять его удаленно. Представьте себе очень длинный текст или некоторые внутренние классы, например, перечисления. –

ответ

0

Это поведение по дизайну.

Альтернатива - вызов конструктора без аргументов, соответствующего временному полю - может иметь нежелательные побочные эффекты.

+0

Вы говорите его по дизайну. Где я могу найти спецификацию? Какие «нежелательные» побочные эффекты могут быть? –

+0

Что происходит, например, если конструктор генерирует исключение? Просто установка «null» * гораздо более разумная. Я посмотрю на JLS позже. – Bathsheba

+0

Интересный вопрос. В любом случае это поведение предотвратит внутренние перечисления и классы. Для этого требуется другая модель программирования в некоторых областях. –

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