Apache flex Flex:AMF和Enum singleton–;他们一起玩得好吗?

Apache flex Flex:AMF和Enum singleton–;他们一起玩得好吗?,apache-flex,actionscript,amf,pyamf,Apache Flex,Actionscript,Amf,Pyamf,我使用Python+PyAMF与Flex客户机来回对话,但我使用的psudo枚举单例遇到了一个问题: class Type { public static const EMPTY:Type = new Type("empty"); public static const FULL:Type = new Type("full"); ... } 当我使用本地创建的实例时,一切都很完美: if (someInstance.type == Type.EMPTY) { /* d

我使用Python+PyAMF与Flex客户机来回对话,但我使用的psudo枚举单例遇到了一个问题:

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.EMPTY
type.FULL

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

是否有某种方法可以控制AMF的反序列化,以便在加载远程
类型时调用正确的转换?还是我应该咬紧牙关,用
=
以外的东西比较
类型
?或者我可以用某种方式欺骗
=
类型的内聚来做我想做的事情吗


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

随机思考:也许您可以在类型上创建一个成员函数,返回与之匹配的规范版本

比如:

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


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

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

比如:

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


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

hhmm…这不是个坏主意。我甚至可以在类型的客户机中有一个getter,类似于
函数get Type():Type{return\u Type.canonical;}
。谢谢现在,你提到我可以在内部转换它们…有什么方法可以自动触发转换吗?
Remoting
工具是否提供了“在这个实例被反序列化之后”类型的钩子?我说的是隔离层。如果您与python的通信层是隔离的(只有一个类处理来自它的消息),那么您可以在将数据传递给处理它的任何对象之前在那里进行转换。如果不知道代码的更多细节,就很难说你会把它放在哪里。嗯……这不是个坏主意。我甚至可以在类型的客户机中有一个getter,类似于
函数get Type():Type{return\u Type.canonical;}
。谢谢现在,你提到我可以在内部转换它们…有什么方法可以自动触发转换吗?
Remoting
工具是否提供了“在这个实例被反序列化之后”类型的钩子?我说的是隔离层。如果您与python的通信层是隔离的(只有一个类处理来自它的消息),那么您可以在将数据传递给处理它的任何对象之前在那里进行转换。如果不知道更多关于代码的细节,就很难说你会把它放在哪里。