我正在使用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.EMPTY
或Type.FULL
。
那么,使代码工作的最佳方法是什么?
我是否可以通过某种方式控制AMF的反序列化,因此当它加载远程Type
时,会调用正确的转换?或者我应该咬紧牙关并使用Types
之外的其他内容来比较==
?或者我可以以某种方式欺骗==
类型的凝聚力来做我想做的事情吗?
编辑:或者,Flex的远程处理套件是否提供了在反序列化实例后运行的任何挂钩,那么我可以执行转换呢?
答案 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代码之间有一个隔离层,你可以确保你做转换那里。
它不像你可以控制反序列化一样干净,但只要你有一个好的隔离层就可以工作。