2

我有一个具有仅 UI 需要的属性的 autobean。我相信您可以清除值并且AutoBeanCodex不会序列化该属性,但这等同于序列化所需的额外步骤。

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

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

那么,除了在序列化时将值清空,还有其他方法可以防止 autobean 属性被序列化吗?

4

2 回答 2

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.
 */

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

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

/**
 * 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)了解执行此操作的一种方法)才能调用这些方法。

于 2012-12-12T22:52:06.983 回答
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); 

}
}
于 2014-02-28T21:59:02.300 回答