2009-09-16 1 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.EMPTY или Type.FULL.

Итак, что является лучшим способом заставить мой код работать?

Есть ли способ управлять десериализацией AMF, поэтому, когда он загружает удаленный Type, будет вызвано правильное преобразование? Или я должен просто укусить пулю и сравнить Types, используя что-то, кроме ==? Или я мог бы как-то обмануть связь типа ==, чтобы делать то, что я хочу?

Редактировать: В качестве альтернативы, удаленный набор Flex предоставляет любые крючки, которые запускаются после того, как экземпляр был десериализован, чтобы я мог выполнить преобразование?

ответ

1

Случайные мысли: Может быть, вы можете создать функцию-член в типе, которая вернет каноническую версию, которая соответствует ей?

Что-то вроде:

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; 

затем использовать т после этого.

Если вы не можете сказать, когда все происходит от python и когда они из AS3, тогда это будет довольно грязно, но если у вас есть изолирующий уровень между AS и кодом на Python, вы можете просто убедиться, что изменение там.

Это не так чисто, как если бы вы могли контролировать десериализацию, но до тех пор, пока у вас есть хороший изолирующий слой, он должен работать.

+0

hhmm ... Это неплохая идея. Я мог бы даже получить getter в клиентах типа, что-то вроде 'function get type(): Type {return _type.canonical; } '. Благодаря! –

+0

Теперь вы упоминаете, что я мог бы преобразовать их изнутри ... Можно ли каким-то образом запустить это преобразование автоматически? Используют ли инструменты 'Remoting' какие-либо« после того, как этот экземпляр был deserailiezd »типа крючков? –

+0

Я говорил об изолирующем слое. Если ваш уровень связи на python изолирован (только один класс, который обрабатывает сообщения от него), вы можете выполнить преобразование там, прежде чем передавать данные на все, что будет обрабатывать его. Трудно сказать, где бы вы выразились, не зная намного больше о своем коде. – Herms