Насколько я могу судить, это не работает для не-коллекционных типов, или, более конкретно, в ситуациях, когда конкретный тип используется для сериализации, а тип интерфейса используется для десериализации. То есть, если у вас есть простой класс, реализующий интерфейс, и вы сериализуете конкретный класс, а затем задаете интерфейс для десериализации, вы окажетесь в неисправимой ситуации.
В приведенном выше примере адаптер типа зарегистрирован для интерфейса, но при сериализации с использованием конкретного класса он не будет использоваться, то есть данные CLASS_META_KEY никогда не будут установлены.
Если вы укажете адаптер в качестве иерархического адаптера (тем самым указав gson использовать его для всех типов в иерархии), вы окажетесь в бесконечном цикле, поскольку сериализатор будет просто вызывать себя.
Кто-нибудь знает, как сериализовать из конкретной реализации интерфейса, а затем десериализовать, используя только интерфейс и InstanceCreator?
По умолчанию кажется, что gson создаст конкретный экземпляр, но не устанавливает его поля.
Проблема регистрируется здесь:
http://code.google.com/p/google-gson/issues/detail?id=411&q=interface