Flex:AMF和Enum Singletons - 他们可以一起玩吗?

时间:2009-09-16 18:49:53

标签: flex actionscript amf pyamf

我正在使用Python + PyAMF与Flex客户端来回交谈,但是我遇到了psudo-Enum-Singletons我正在使用的问题:

class Type {
    public static const EMPTY:Type = new Type("empty");
    public static const FULL:Type = new Type("full");
    ...

}

当我使用本地创建的实例时,一切都很好看:

if (someInstance.type == Type.EMPTY) { /* do things */ }

但是,如果'someInstance'来自Python代码,那么'type'的实例显然不会是Type.EMPTYType.FULL

那么,使代码工作的最佳方法是什么?

我是否可以通过某种方式控制AMF的反序列化,因此当它加载远程Type时,会调用正确的转换?或者我应该咬紧牙关并使用Types之外的其他内容来比较==?或者我可以以某种方式欺骗==类型的凝聚力来做我想做的事情吗?

编辑:或者,Flex的远程处理套件是否提供了在反序列化实例后运行的任何挂钩,那么我可以执行转换呢?

1 个答案:

答案 0 :(得分:1)

随机思考:也许你可以在Type上创建一个成员函数,它将返回与之匹配的规范版本?

类似的东西:

class Type {
  public static const EMPTY:Type = new Type("empty");
  public static const FULL:Type = new Type("full");
  ...

  // I'm assuming this is where that string passed
  // in to the constructor goes, and that it's unique.
  private var _typeName:String;

  public function get canonical():Type {
    switch(this._typeName) {
      case "empty": return EMPTY;
      case "full": return FULL;
      /*...*/
    }
  }
}

只要您知道哪些值来自python,您最初只需转换它们:

var fromPython:Type = /*...*/
var t:Type = fromPython.canonical;

然后用t之后。

如果你不知道什么时候来自python,什么时候它们来自AS3那么它会变得相当混乱,但如果你在AS和python代码之间有一个隔离层,你可以确保你做转换那里。

它不像你可以控制反序列化一样干净,但只要你有一个好的隔离层就可以工作。