Flex: AMF и Enum Singletons - могут ли они хорошо играть вместе? - PullRequest
1 голос
/ 16 сентября 2009

Я использую Python + PyAMF для общения с клиентами Flex, но у меня возникла проблема с псевдо-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 какие-либо перехваты, запускаемые после десериализации экземпляра, поэтому я мог бы выполнить преобразование тогда?

1 Ответ

1 голос
/ 16 сентября 2009

Случайная мысль: Может быть, вы могли бы создать функцию-член в 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, вы можете просто убедиться, что вы выполняете преобразование есть.

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

...