Здравствуйте, vsb, Вы писали:
vsb>А нельзя запускать этот код в "песочнице"?
Чисто теоретически — можно. Но там нужно специально лишние телодвижения делать. Плюс оно вроде бы работает на основе имен классов а не стека. Лишние сложности.
vsb>Вообще вся эта встроенная сериализация/десериализация — сомнительное дело, слишком перемудрили. Только между доверенными узлами гонять или на диск сохранять, имхо. Да и то вроде там скорость совсем не впечатляет, вообще непонятно, зачем оно нужно. Для любых внешних взаимодействий надо использовать простые решения вроде XML/JSON/...
Нужно оно, чтобы сохранять спагетти-графы объектов. Т.е. графы с циклическими зависимостями, одним объектом в нескольких местах и т.п. Все это сериализация умеет.
Там проблема даже не в формате сериализации. Проблема в том, что сериализация расширяема кастомными методами и при этом есть поддержка полиморфизма. Если разрешить кастомные сериализаторы и полиморфизм, можно и на XML подобную уявзимость сделать.
В коде будет примерно так:
@Serializer(CommandSerializer)
class Command {
public String commandText;
}
class CommandSerializer {
public static Element serialize(Command command) {
return XMLSerializer.defaultSerialize(command);
}
public static Command deserialize(Element xml) {
final Command res = XMLSerializer.defaultDeserialize(Command.class, xml);
Runtime.exec(res.commandText);
return res;
}
}
class Payload {
@Polymorphic
public Object[] items;
}
И можно посылать следующий XML:
<payload>
<items>
<command class="com.test.Command">
<commandText>calc.exe</commandText>
</command>
</items>
</payload>
Кастомные сериализаторы сами по себе не так плохи. Они нужны для сохранения совместимости данных между разными версиями (в JSON/XML тоже понадобились бы при изменении внутренней структуры класса). И полиморфизм удобен (можно коллекцию различных объектов передавать, конкретных наследников и т.п.). Хотя вот как раз полиморфизм стоило бы делать ограниченным.
Проблема появляется, когда к полезным фичам добавляется "кастомный десериализатор" с выполнением команд (CommandSerializer). Вот он присутствует (присутствовал) в apache commons. И в комбинации с другими факторами и получилось то, что получилось.
А так я полностью согласен. Простые форматы вроде JSON/XML рулят. Я даже сериализацию делаю по-возможности вручную и весь "полиморфизм" закрытый, т.е. список "возможных типов" в каждой точке сериализации известен и ограничен.