2013-07-12 2 views
1

Я создаю приложение Adobe AIR, и я храню словарь в своем SharedObject. Что-то вроде строк here.Длина свойства моего сериализованного словаря для хранения в SharedObject

Но почему длина моего словаря всегда равна нулю. В итоге мне приходится вручную отслеживать длину, которая, похоже, работает, но не наполняет меня уверенностью.

Также может кто-то объяснить, когда именно readExternal и writeExternal вызывается? Я нахожу, что их называют несколько раз (для чего мне кажется ненужным). Поскольку это словарь, добавление одного и того же значения несколько раз не доказывает проблемы, но опять же, интересно, установил ли я что-то неправильно здесь, чтобы вызвать это.

Это то, что у меня есть

public class SharedObjectDictionary implements IExternalizable { 

private var _dictionary:Dictionary; 
private var _length:int; 

public function addItem and removeItem 
{ 
... just adds/removes to my _dictionary ... 
... and keeps track of the length ... 
} 

public function readExternal(input:IDataInput):void 
{ 
    var count:int = input.readInt(); 
    for (var i:Number = 0;i<count;i++) 
    { 
     var key:String = input.readObject(); 
     var val:String = input.readObject(); 

     addItem(key,val); 
    } 
} 

public function writeExternal(output:IDataOutput):void 
{ 
    output.writeInt(_length); 

    for (var key:Object in dictionary) 
    { 
     output.writeObject(key); 
     output.writeObject(dictionary[key]); 
    } 
} 

}

Когда я делаю вызов, чтобы сохранить этот SharedObject как таковой

var so:SharedObject = SharedObject.getLocal("xxxx"); 
    so.data["xxxxx"] = instance of the SharedObjectDictionary above; 
    so.flush(); 
    so.close(); 
    so = null; 

я считаю, что readExternal вызывается один раз и writeExternal получает 3 раза.

Спасибо!

ответ

0

Длина вашего Dictionary всегда null, так как Dictionary не определяет такое свойство. Если вы попытались получить доступ к свойству, которое не существует в каком-либо другом классе, вы получите ошибку времени компиляции. Но так как класс Dictionary равен dynamic, такой ошибки компиляции не произойдет. Единственное решение - следить за длиной самостоятельно.

Я не могу прокомментировать ваш другой вопрос о readExternal/writeExternal ... есть ли у вас код, который вы можете показать, который демонстрирует это?

+0

ах имеет смысл для нулевого тогда! См. Мой отредактированный вопрос с большим количеством кода, демонстрирующим, что я делаю. –

+1

Только совет: мне очень нравится «LinkedMap», найденный в пакете as3commons-collection [as3commons.org] (http://www.as3commons.org). Это в основном комбинация словаря и массива, поэтому «длина» - наряду со многими другими полезными вещами - уже позаботилась. –

+0

приятно, спасибо Т. –