Как удалить типы реализации из политики сериализации GWT? - PullRequest
5 голосов
/ 22 января 2010

Противоположность этому вопросу: Как добавить тип в белый список политики сериализации GWT?

GWT добавляет нежелательные типы в политику сериализации и раздувает мой JS. Как мне урезать мой белый список GWT вручную? Или я должен вообще?

Например, если я поместил интерфейс List в класс обслуживания GWT RPC, GWT должен сгенерировать Javascript, который обрабатывает ArrayList, LinkedList, Stack, Vector, ... хотя моя команда знает, что мы только когда-нибудь вернемся ArrayList. Я мог бы просто сделать метод возвращаемого типа ArrayList, но мне нравится полагаться на интерфейс, а не на конкретную реализацию. В конце концов, может быть, однажды мы включим его и вернем, например, LinkedList. В этом случае я бы хотел, чтобы политика сериализации GWT компилировалась только для ArrayList и LinkedList. Нет стеков или векторов.

У этих неявных ограничений есть один огромный недостаток, о котором я могу думать: новый член команды начинает возвращать Векторы, что будет ошибкой во время выполнения. Итак, помимо вопроса в названии, каков ваш опыт проектирования вокруг этого?

Ответы [ 2 ]

8 голосов
/ 22 марта 2010

Существует свойство, которое может вносить этот черный список классов. Например, чтобы добавить в черный список коллекции, не относящиеся к ArrayList, добавьте эти строки в ваш * .gwt.xml:

<extend-configuration-property name="rpc.blacklist" value="java.util.HashSet"/>
<extend-configuration-property name="rpc.blacklist" value="java.util.LinkedHashSet"/>
<extend-configuration-property name="rpc.blacklist" value="java.util.LinkedList"/>
<extend-configuration-property name="rpc.blacklist" value="java.util.Stack"/>
<extend-configuration-property name="rpc.blacklist" value="java.util.TreeMap"/>
<extend-configuration-property name="rpc.blacklist" value="java.util.TreeSet"/>
<extend-configuration-property name="rpc.blacklist" value="java.util.Vector"/>

Это было необходимо для уменьшения размера JS при отправке встроенных в GWT com.google.gwt.user.client.ui.SuggestOracle$Response объектов по проводам. Такие объекты содержат коллекцию java.util.Collection, но я знал, что буду отправлять только ArrayList.

Я все еще уважаю преимущества проверок во время компиляции, которые обсуждались в других ответах, комментариях и моем первоначальном вопросе. Действительно, это ошибочное решение, если GWT начинает собирать дополнительные реализации для сериализации (почему это не белый список?). Однако это свойство "rpc.blacklist" избавило меня от прокрутки моего собственного SuggestOracle, чтобы получить более конкретный тип коллекции.

6 голосов
/ 16 февраля 2010

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

GWT уже удаляет дополнительный код за пределами интерфейсов RPC - например, если вы берете приложение без RPC, вы можете свободно использовать интерфейсы, такие как List и Map и Set to your hearts, - GWT автоматически включает только реализации который вы на самом деле используете. Зачем? Потому что он имеет доступ к вашему коду и способен фактически проходить через все видимые перестановки кода и удалять неиспользуемые классы. Таким образом, GWT на самом деле не создает взрывы классов при использовании интерфейсов.

Проблема полностью в RPC. Смысл службы RPC состоит в том, что серверу необходимо реализовать интерфейс RPC - это означает, что если интерфейс требует, чтобы метод возвращал список, сервер может возвращать любую реализацию списка, которую он хочет, до тех пор, пока как это можно сериализовать.

В этом проблема - у GWT нет абсолютно никакой возможности узнать, какую реализацию интерфейса будет использовать сервер, либо во время компиляции, либо в какой-то момент в будущем. Код сервера может и во многих случаях разрабатывается независимо от кода на стороне клиента. Таким образом, единственный способ безопасно получить объект типа List по проводам - ​​это заранее знать обо всех возможных его реализациях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...