有没有办法注释AutoBean属性,以便它不会被序列化/反序列化?

时间:2012-12-12 21:49:19

标签: gwt autobean

我有一个autobean,其中只有UI需要一个属性。我相信你可以使值无效,而AutoBeanCodex不会序列化该属性,但这等同于序列化所需的额外步骤。

我希望有一些类似于Editor @Ignore注释的注释。例如:

public interface Foo {
    ...
    @Ignore
    String getUiOnlyProperty();
}

因此,除了在序列化时将值清零之外,还有其他方法可以保持autobean属性不被序列化吗?

2 个答案:

答案 0 :(得分:2)

Autobeans是JSON / XML /无论何种格式的Java皮肤 - 它们实际上并不是为了保存其他数据而设计的。也就是说,有几种想法可以用开箱即用的工具来解答你的问题,或者可能激发一些关于如何解决问题的其他想法。

您应该能够通过省略setter来构建只读属性。这不是你要求的,但仍然可能很方便。

沿着这些方向,@PropertyName注释的JavaDoc似乎暗示了这个可能的特征:

/**
 * An annotation that allows inferred property names to be overridden.
 * <p>
 * This annotation is asymmetric, applying it to a getter will not affect the
 * setter. The asymmetry allows existing users of an interface to read old
 * {@link AutoBeanCodex} messages, but write new ones.
 */

阅读旧消息但是编写新消息似乎可能更接近您所追求的内容,并且仍然允许您使用看起来像豆子的东西。

真正的答案似乎是AutoBean.setTaggetTag方法:

/**
 * A tag is an arbitrary piece of external metadata to be associated with the
 * wrapped value.
 * 
 * @param tagName the tag name
 * @param value the wrapped value
 * @see #getTag(String)
 */
void setTag(String tagName, Object value);

...

/**
 * Retrieve a tag value that was previously provided to
 * {@link #setTag(String, Object)}.
 * 
 * @param tagName the tag name
 * @return the tag value
 * @see #setTag(String, Object)
 */
<Q> Q getTag(String tagName);

AbstractAutoBean中这些方法的实现可以看出,这些方法将数据存储在与通过网络发送的内容完全不同的对象中。缺点是您需要获取底层的AutoBean对象(请参阅com.google.web.bindery.autobean.shared.AutoBeanUtils.getAutoBean(U)以获得一种方法)以调用这些方法。

答案 1 :(得分:0)

解码为父接口的子类/接口在解码时不会爆炸,允许货物在编组步骤之前一起传递。我对下面实际代码的即时测试是按预期执行的。

  public interface ReplicateOptions {
    /**
     * Create target database if it does not exist. Only for server replications.
     */
    Boolean getCreateTarget();

    void setCreateTarget(Boolean create_target); 

  //baggage to pass along
  interface ReplicateCall<T> extends ReplicateOptions   {

      /**
       * If true starts subscribing to future changes in the source database and continue replicating them.
       */
      AsyncCallback<T> getContinuous();

      void setContinuous(AsyncCallback<T> continuous); 

}
}