1

我正在使用 LCDS 和 Flex。当我将一个对象从 java 发送到 Flex 时,我不想发送所有属性。据我所知,如果您不想序列化,请制作一个临时变量。

例如。

 private transient Date birthDate;

 public Date getBirthDate(){  
    return birthDate;
 }

 public void setBirthDate(Date val){
    birthDate = val;
    //Some code here.
 }

现在序列化的对象中不应该有birthDate。但是,当我看到 AMF 日志时,该对象的birthDate 中有值。
序列化是否查看代码并检查私有变量是瞬态的。(我不明白它如何访问私有属性。我有点困惑。)
我应该将变量标记为公共的吗?然后 getter 和 setter 没有意义,而且我在 setter 方法中编写了一些代码。所以我需要二传手。

问题:

  1. 我在一本书(Brain Telintelo 的 Enterprise flex with blazeds,第 15 章)中读到,开箱即用的 Blazeds 仅序列化具有匹配的 getter 和 setter 的文件。如果是这样的话,will blazeds 甚至会费心去检查私有财产是否是暂时的。

  2. 有人可以解释一下正常的序列化(不是 amf 序列化)如何发生并跟踪私有瞬态变量,即使它们有公共的 getter 和 setter。

  3. 如何在 Flex/LCDS/BlazeDS 环境中使 java 变量不序列化。

我在对象中有 50-60 个变量,不应该对 4 或 5 个变量进行序列化。所以在这么大的对象中编写自定义序列化器是一个很大的痛苦。我看到的另一个缺点是,如果我编写自己的序列化程序,休眠将无法使用此对象。

4

3 回答 3

2

我通常使用 Granite Data Services(而不是 LCDS 或 Blaze),但您是否尝试过使用 [Transient] ActionScript 标签?(当然,如果您正在生成 .as 类,这可能是一个问题 - 也许有一个 @Transient 注释?)

http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html

其工作方式取决于谁(什么)在进行序列化。例如,我相信 Granite 的行为与 Blaze 略有不同。我不认为 Granite 序列化私有属性(可能记错了)。我还记得几年前,我为 Granite 创建了一个自定义序列化类,它告诉它忽略带有“瞬态”Java 关键字的字段(使用反射)。

我不知道您是否可以在 Blaze/LCDS 中实现自定义序列化逻辑(同样容易),但这也可能值得研究。这不是一个巨大的痛苦(如你所说),因为它只是我定制的一个类,但我再次确定这是简单的 w/Granite。

为此可能有一两个辅助库。写这个的人写了这个http://www.flexpasta.com/index.php/2008/05/19/blazeds-with-annotations-for-remote-objects/似乎正在做你反向要求的事情。(没有设置器时强制序列化。)

于 2011-09-07T22:41:16.383 回答
1

如果您想排除一个 Java 属性被序列化为 Flex,这里是同一个问题的帖子:https ://stackoverflow.com/a/22328869/244911

于 2014-03-11T14:35:59.260 回答
0

将 [Transient] 放在 getter 上就足够了,把它放在 setter 上是多余的和多余的,并且会在编译器警告中重新出现。

于 2013-10-02T07:39:59.077 回答