Почему в этом эксперименте ByteArray происходит сбой AIR - PullRequest
0 голосов
/ 05 декабря 2011

Я записываю данные в новый ByteArray и сохраняю их в LocalStore

var ba:ByteArray = new ByteArray;
ba.writeObject(theobject);

EncryptedLocalStore.setItem(MY_VAL_STORE, ba); //bytes in local store

В качестве эксперимента я пытаюсь превратить первые 2 строки в одну строку, поэтому я использую этот синтаксис (я в основном помещаю новый массив ByteArray в скобки и сразу его использую).

var ba:ByteArray = (new ByteArray).writeObject(theobject) as ByteArray;

EncryptedLocalStore.setItem(MY_VAL_STORE, ba); //bytes in local store

Но это приводит к сбою приложения AIR во время выполнения. Если я вернусь к 2 линиям, это работает нормально. Я понимаю, что это не так уж важно, но мне любопытно, почему этот творческий синтаксис не работает. Есть идеи?

примечание: в 1-строчной версии, если я не добавлю as ByteArray, он жалуется, что я пытаюсь использовать тип void с ByteArray.

Ответы [ 2 ]

8 голосов
/ 05 декабря 2011

Вы сами ответили на свой вопрос:

жалуется, что я пытаюсь использовать тип void с ByteArray.

В вашем объявлении вы присваиваете результат writeObject() вашей переменной ByteArray, а не экземпляру, созданному new ByteArray(). Поскольку тип результата void, это присваивание недопустимо и приводит к тому, что компилятор выдает ошибку. Затем вы добавили ручное приведение void в ByteArray, что, очевидно, достаточно, чтобы обмануть компилятор, но не предотвращает ошибку приведения типа во время выполнения.

Вкратце: этот тип присваивания работает только в том случае, если методы, вызываемые в новом экземпляре, возвращают this. Кстати, полезный способ сделать код более читабельным, также известный как концепция Метод цепочки .

1 голос
/ 05 декабря 2011

Глядя на документацию для вызова writeObject , я предполагаю, что ваш код не работает, поскольку возвращаемое значение метода равно void, и вы пытаетесь привести его к ByteArray.

...