Java — Можно ли прочитать сериализованный объект без приведения?

#java #generics

#java #дженерики

Вопрос:

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

 vars = (HashMap<String, Integer>) out.readObject();
  

Будучи поклонником информации о типах, я ненавижу приведение. Можно ли избежать этого и явно указать, какой тип следует считывать из сериализованного файла?

Комментарии:

1. Я думаю, что другого метода нет.

2. Нет. Разберитесь с этим.

Ответ №1:

ObjectInputStream не является универсальным типом и не предоставляет универсальных методов.

Для предоставленных существуют специальные методы read[primitive] , но для реальных объектов readObject предоставляется только is — который возвращает Object .

Конечно, если вам не нужно использовать собственные Serializable Externalizable интерфейсы Java или и вы предпочитаете сериализовать с помощью определенных фреймворков (например, Jackson), вы можете воспользоваться методами, которые не требуют явного понижения при де-сериализации.

Примечание

ObjectInputStream нет final , и вы можете расширить его, чтобы предоставить свою собственную реализацию, которая могла бы позволить вам предоставить универсальный класс или метод и предотвратить приведение при вызове какого readTypedObject -либо собственного метода.

Затем вы могли бы сравнить readClassDescriptor() с инициализированной Class<T> вами собственной ObjectInputStream реализацией, чтобы убедиться, что считываемый объект может быть назначен вашему параметризованному типу.

Однако T в какой-то момент вы все равно закончите приведение к, поскольку вы, вероятно, тоже не хотите переопределять readObject !

TL; DR, на мой взгляд, слишком много усилий и сложностей, я бы просто пошел с приведением на стороне получателя.

Комментарии:

1. К сожалению, OIS на самом деле имеет общие методы, такие как private final Object readObject(Class<?> type) , но они являются частными для реализации.