2009-09-16 48 views
1

我使用Python + PyAMF的交谈来回Flex客户端,但我已经运行到与psudo-Enum的单身问题我使用:Flex:AMF和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.EMPTYType.FULL

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

有什么方法可以控制AMF的反序列化,所以当它加载远程Type时,会调用正确的转换吗?或者我应该咬下子弹,并使用==以外的东西比较Types?或者我可以以某种方式欺骗==类型的凝聚力做我想做的事情?

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

回答

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

只要你知道哪个值来自蟒你只需将它们转换开始:

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

然后,使用T之后。

如果你不能确定什么时候来自python,什么时候来自AS3,那么它会变得非常混乱,但是如果你在AS和Python代码之间有一个隔离层,那么你可以确保你做了转换。

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

+0

hhmm ...这不是一个坏主意。我甚至可以在Type的客户端中有一个getter,就像'function get type():Type {return _type.canonical; }'。谢谢! – 2009-09-16 21:16:30

+0

现在,你提到我可以在内部进行转换...有什么方法可以自动触发转换吗? 'Remoting'工具是否提供了'这个实例被deserailiezd'类型的钩子之后? – 2009-09-16 21:17:55

+0

我在谈论隔离层。如果您与python的通信层是隔离的(只有一个类处理来自它的消息),那么您可以在将数据传递给任何将要处理的数据之前进行转换。不知道你的代码的更多细节,很难说你把它放在哪里。 – Herms 2009-09-17 13:30:22

相关问题