| /* |
| * Copyright 2010 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.web.bindery.requestfactory.shared; |
| |
| /** |
| * Serializes graphs of EntityProxy objects. A ProxySerializer is associated |
| * with an instance of a {@link ProxyStore} when it is created via |
| * {@link RequestFactory#getSerializer(ProxyStore)}. |
| * <p> |
| * The {@link EntityProxy#stableId()} of non-persisted (i.e. newly |
| * {@link RequestContext#create(Class) created}) {@link EntityProxy} instances |
| * are not stable. |
| * <p> |
| * To create a self-contained message that encapsulates a proxy: |
| * |
| * <pre> |
| * RequestFactory myFactory = ...; |
| * MyFooProxy someProxy = ...; |
| * |
| * DefaultProxyStore store = new DefaultProxyStore(); |
| * ProxySerializer ser = myFactory.getSerializer(store); |
| * // More than one proxy could be serialized |
| * String key = ser.serialize(someProxy); |
| * // Create the flattened representation |
| * String payload = store.encode(); |
| * </pre> |
| * |
| * To recreate the object: |
| * |
| * <pre> |
| * ProxyStore store = new DefaultProxyStore(payload); |
| * ProxySerializer ser = myFactory.getSerializer(store); |
| * MyFooProxy someProxy = ser.deserialize(MyFooProxy.class, key); |
| * </pre> |
| * |
| * If two objects refer to different EntityProxy instances that have the same |
| * stableId(), the last mutable proxy encountered will be preferred, otherwise |
| * the first immutable proxy will be used. |
| * |
| * @see DefaultProxyStore |
| */ |
| public interface ProxySerializer { |
| /** |
| * Recreate a proxy instance that was previously passed to |
| * {@link #serialize(BaseProxy)}. |
| * |
| * @param <T> the type of proxy object to create |
| * @param proxyType the type of proxy object to create |
| * @param key a value previously returned from {@link #serialize(BaseProxy)} |
| * @return a new, immutable instance of the proxy or {@code null} if the data |
| * needed to deserialize the proxy is not present in the ProxyStore |
| */ |
| <T extends BaseProxy> T deserialize(Class<T> proxyType, String key); |
| |
| /** |
| * Recreate a {@link EntityProxy} instance that was previously passed to |
| * {@link #serialize(BaseProxy)}. |
| * |
| * @param <T> the type of proxy object to create |
| * @param id the {@link EntityProxyId} of the desired entity |
| * @return a new, immutable instance of the proxy or {@code null} if the data |
| * needed to deserialize the proxy is not present in the ProxyStore |
| */ |
| <T extends EntityProxy> T deserialize(EntityProxyId<T> id); |
| |
| /** |
| * Store a proxy into the backing store. |
| * |
| * @param proxy the proxy to store |
| * @return a key value that can be passed to |
| * {@link #deserialize(Class, String)} |
| */ |
| String serialize(BaseProxy proxy); |
| } |