1

我正在使用 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.EMPTYor Type.FULL

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

有什么方法可以控制 AMF 的反序列化,所以当它加载 remote 时Type,会调用正确的转换?还是我应该咬紧牙关并Types使用其他东西进行比较==?或者我可以以某种方式欺骗==类型凝聚力来做我想做的事吗?

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

4

1 回答 1

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 代码之间有一个隔离层,你可以确保在那里进行转换。

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

于 2009-09-16T18:57:35.473 回答