Десериализация случайного производного класса известного суперкласса - PullRequest
3 голосов
/ 08 июля 2011

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

Предположим, у вас есть следующие классы:

public class Base implements Serializable {
    // ...
}

public class Der1 extends Base {
    // ...
}

public class Der2 extends Base {
    // ...
}

Алиса случайным образом создает объект Der1 или Der2, сериализует его в файл и отправляет Бобу. Боб знает, что класс этого объекта является подклассом Base, но не знает, какой из них (у него те же определения классов, что и у Алисы). Как Боб может десериализовать файл как экземпляр правильного подкласса?

Моей первой мыслью было, что Алиса может определить класс следующим образом:

public DerClass implements Serializable {
    public Class<? extends Base> class;
}

Она использует это для хранения класса объекта, сериализует его и отправляет Бобу. Боб создает из этого файла объект DerClass, читает переменную class, использует его для создания экземпляра соответствующего подкласса и считывает в него сериализованный объект. Будет ли это работать? Есть ли лучший способ?

1 Ответ

5 голосов
/ 08 июля 2011

Приложение десериализации не должно знать тип, ему нужно только иметь тот же класс, доступный в пути к классам.например, Алиса должна иметь все классы, которые может отправить Боб, и их родителей и иждивенцев.

// Bob sends
Base base = // some Base class
objectOutputStream.writeObjec(base);

// Alice receives
Base base = (Base) objectInputStream.readObject();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...