IExternalizable (as3) - PullRequest
       24

IExternalizable (as3)

1 голос
/ 09 ноября 2011

кто-нибудь использовал интерфейс IExternalizable?...

У меня есть фундаментальный вопрос.Когда я сериализовал свой объект ... и сохранил как файл .... и теперь я хочу внести некоторые изменения в класс ... например, добавить атрибут ... Я не могу повторно преобразовать файл вобъект этого класса ... потому что в методе readExternal теперь есть еще один атрибут, которому хранимый объект (файл) не принадлежит ....

есть ли способ сделать это более гибким?

- // немецкий

Hallo hat schon mal jemand das im Titel erwähnte Интерфейс benutzt?...

Habe mal ne grundlegende Frage dazu.Я хочу, чтобы у вас был какой-нибудь предмет ... и у него есть мечты ... и уныние в классе ... Внушаемое имя ... не знаю, как у вас дела?... Вай-ин-дер-Читай Внешний метод монахинта Атрибут mehr abgefragt wird, welches das gespeicherte Objekt (Datei) nicht besitzt ....

gibts da Möglichkeiten das Flexibler zu machen?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Вы должны зарегистрировать псевдоним этого класса, используя flash.net.registerClassAlias функция. Эта вещь добавляет некоторые метаданные (если я прав) в записанный объект Amf, который позволяет Flash определять исходный класс.

Затем загрузите файл из файловой системы или сети как ByteArray и прочитайте объект, используя метод ByteArray#readObject().

Подробнее об этом: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/package.html

1 голос
/ 27 октября 2015

Если вы добавляете, удаляете или изменяете атрибут вашего класса, это несовместимое изменение API. Подумайте, является ли ваш класс частью библиотеки программного обеспечения, уже используемой другими разработчиками (например, вашими коллегами, или если ваша библиотека с открытым исходным кодом, любой, кто загрузил ее и начал создавать свой проект с ее использованием), если вы делаете несовместимым измените это, немедленно код других людей может перестать работать или работать неправильно. Такого рода изменения API допускаются только между основными новыми выпусками (например, ваша версия библиотеки была v1.X.Y, а вы выпускаете v2.0.0).

Когда вы сериализовали экземпляр вашего SomeClass в файл, имя класса также сохраняется в этом файле, поэтому при чтении этого экземпляра из файла Flash будет знать, какой класс создать. Однако учтите, что если вы измените свой API, это больше не тот же SomeClass, имя то же самое, но определение класса другое. Легкого пути нет.

Если вам действительно нужно сохранить доступ к данным в этом файле. Простым решением было бы сохранить информацию о версии в вашем файле данных в качестве первого элемента. Каждый раз, когда вы меняете формат файла, вы должны увеличивать версию. При записи файла сначала напишите текущую версию. При чтении файла прочитайте текущую версию и сохраните ее как общедоступное статическое свойство в классе, к которому можно получить доступ из любого места вашего проекта (например, создайте отдельный класс DataLoaderInfo и общедоступную статическую переменную format formatVersion: String или uint). Затем продолжайте читать свой файл, как вы делали раньше. В вашем классе SomeClass, который вы хотите изменить, будет выглядеть так:

function readExternal(input:IDataInput):void {

    // Read format version 0 properties.
    oldIntProperty1 = input.readInt();
    oldIntProperty2 = input.readInt();
    ...
    // Read format version 1 properties.
    if (DataLoaderInfo.formatVersion >= 1) {
        newIntProperty1 = input.readInt();
        ...
    }
    // Read format version 2 properties.
    if (DataLoaderInfo.formatVersion >= 2) {
        ...
    }
    ...
}

Вы можете себе представить, если у вас много версий формата файла, код может стать довольно сложным. Все зависит от того, какое приложение вы разрабатываете и сколько версий может быть развернуто на месте одновременно. Например, если ваше приложение является мобильным приложением, хранящим свои настройки или состояние в двоичном файле, каждый пользователь может обновляться с разными интервалами, поэтому пользователь может обновить вашу последнюю версию с других более старых версий, поэтому ваше приложение должно иметь возможность Изящно загружайте конфиги всех этих версий. Если все ваши данные хранятся на вашем собственном сервере, и единственный доступ к этим данным осуществляется через последнюю версию вашего приложения, также развернутую на вашем сервере, вам нужно только поддерживать форматы последней развернутой версии и текущей (новой) версия.

Вы также можете создать отдельное служебное приложение для преобразования файла данных в обновленный формат.
1) Создайте подкласс ExtSomeClass вашего исходного класса SomeClass. Добавьте ваш новый API (например, свойства) в подкласс. Переопределите методы класса IExternalizable - сначала вызовите методы super, затем прочитайте / запишите добавленные новые свойства.
2) Создайте приложение для конвертации утилит, которое читает ваш оригинальный файл, содержащий экземпляры SomeClass. Для каждого прочитанного SomeClass вы должны создать новый экземпляр ExtSomeClass, скопировав все свойства SomeClass и инициализировав свойства ExtSomeClass с некоторыми приемлемыми значениями по умолчанию. Таким образом, каждый экземпляр SomeClass заменяется ExtSomeClass. Запишите преобразованные данные обратно в ваш файл.Если вы не хотите создавать подкласс и действительно хотите изменить исходный класс SomeClass, вы также можете сделать это, но код преобразования будет более сложным, поскольку вам потребуется доступ как к старой, так и к новой версии вашего класса. класс, очевидно, вы не можете иметь два класса с одинаковыми именами, скомпилированные в вашем проекте, вам придется скомпилировать ваш новый (обновленный) класс в отдельный SWF, приложение для преобразования должно быть скомпилировано с использованием старой версии SomeClass, тогда вы можете прочитайте ваш файл старой версии, каждый экземпляр SomeClass будет прочитан правильно, используя старую версию вашего класса. Загрузите SWF-файл, содержащий ваш новый (обновленный) класс, используя Loader, вы можете использовать loader.loaderInfo.applicationDomain.getDefinitionByName, чтобы получить ссылку на ваш новый класс, вы можете создать экземпляры нового класса таким образом, а затем скопировать все свойства из прочитанных вами экземпляров. из файла.

...