Запись объекта с временными атрибутами в поток (Java) - PullRequest
0 голосов
/ 30 июня 2010

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

Стандартный механизм сериализации Java не помогает. Какие еще варианты у меня есть?

Обновление: Причина, по которой я задаю вопрос, заключается в том, что я хочу изменить существующее приложение Spring. Ранее он вызывал метод bean-компонента in-process, но теперь я хочу переместить bean-компонент на отдельную машину и использовать удаленное взаимодействие Spring через HTTP invoker. И у меня есть проблема с параметрами, которые имеют временные поля, которые необходимо передать этому методу, но не нужно сериализовать в других частях приложения.

Ответы [ 3 ]

3 голосов
/ 30 июня 2010

Хмм - если атрибут помечен как transient, это означает точно , что это не означает, что он считается частью постоянного состояния объекта, например, для сериализации. Тот факт, что вы хотите сделать это вообще, является запахом кода, и правильное решение состоит в том, чтобы остановить эти поля переходными.

Допустим, по какой-то причине вы не можете изменять сами целевые классы. Сначала я подумал, что вы можете настроить сериализацию путем реализации методов readObject() и writeObject(), но это также потребует изменений в целевом классе.

В этом случае вам нужно будет работать с каким-либо API-интерфейсом на основе отражений или метаданных, чтобы сделать это. Существует множество библиотек, которые будут преобразовывать объекты в строки XML, JSON или DB и т. Д. И т. Д. Лучше всего использовать одну из них для преобразования объекта в «гидратированную» форму и из нее (и, вероятно, вам потребуется настроить ее). их, как и любой здравомыслящий сериализатор, будут игнорировать переходные поля). Какой из них выбрать, зависит от вашего текущего программного стека и ваших точных требований.

2 голосов
/ 30 июня 2010

Я полагаю, вы не можете изменить устаревший код.В этом случае, я думаю, вам придется прибегнуть к полям объекта с отражением и DataOutputStream .

1 голос
/ 30 июня 2010

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

Мое первое предложение - поискать методы для этого объекта для пересчета полей transient.

...