3

У меня возникла проблема с попыткой загрузить классы, определенные извне, в ActionScript 3.0. Я считаю, что это проблема с моим пониманием классов ApplicationDomain/LoaderContext, но даже после прохождения документации и нескольких веб-поисков я все еще застрял.Actionscript 3 loading external swf casting issue

По существу, я хочу загрузить swf, содержащий символ, который представляет собой реализацию интерфейса, разделяемого вызывающим swf и загруженным swf. Я могу загрузить swf fine и создавать экземпляры и выполнять на нем методы, но только до тех пор, пока я не пытаюсь передать его в тип общего интерфейса. Если я попытаюсь выполнить его, я получаю TypeError: Error # 1034: Тип Coercion failed: введите ошибку.

Я подозревал, что это связано с тем, что, когда я загружаю новую флеш-память класса, она распознает ее как совершенно другой класс, поэтому исключение. documentation предлагает использовать аргумент LoaderContext, а applicationDomain - ApplicationDomain.currentDomain.

Проблема в том, что это не имеет никакого эффекта. Независимо от того, устанавливаю ли ApplicationDomain значение currentDomain, null или дочерний элемент текущего домена, я все равно получаю ошибку с принудительным приведением типа. Часть ошибки :: часть ошибки указывает, что загруженный мной класс находится в другом пространстве имен или в некоторых таких случаях, когда я хочу, чтобы он находился в том же пространстве имен, что и мой загрузчик.

Код:

import flash.display.Loader; 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.net.URLRequest; 
import flash.system.ApplicationDomain; 
import flash.system.LoaderContext; 

public class TestSkin extends MovieClip 
{ 
    var mLoader:Loader; 

    public function TestSkin() 
    { 
     super(); 
     startLoad("ExternalTest.swf"); 
    } 

    private function startLoad(url:String):void 
    { 
     mLoader = new Loader(); 
     var mRequest:URLRequest = new URLRequest(url); 
     var appDomain:ApplicationDomain = ApplicationDomain.currentDomain; 
        //Loading into different domains seems to have no effect 
     //var appDomain:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); 
     //var appDomain:ApplicationDomain = null; 
     mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler); 
     mLoader.load(mRequest, new LoaderContext(false, appDomain)); 
    } 

    private function onCompleteHandler(loadEvent:Event):void 
    { 
     //Get the object from the loadEvent 
     var obj:Object = loadEvent.target.content; 
     //Verify that the methods exist on the object 
     trace("Loaded item id: " + obj.getInterfaceId()); 
        //This returns Loaded item id: ExternalTestInterfaceImplementation! 
     //Try assigning as an instance of the shared type - fails with type coercion error 
        //Throws the following type error: 
        //TypeError: Error #1034: Type Coercion failed: cannot convert myPackage::[email protected] to myPackage.TestInterface. 
     var castItem:TestInterface = TestInterface(obj); 
     trace("castItem: " + castItem); 
    } 
} 

Интерфейс декларации:

public interface TestInterface 
{ 
    function getInterfaceId():String; 
} 

реализация интерфейса

public class ExternalTestInterfaceImplementation extends MovieClip implements TestInterface 
{ 
    public function getInterfaceId() : String 
    { 
     return "ExternalTestInterfaceImplementation!"; 
    } 

    public override function toString():String 
    { 
     return getInterfaceId();  
    } 
} 
+0

Могли бы вы вставить точное сообщение об ошибке? –

+0

Несомненно. Я пропустил номер строки из-за импорта и т. Д., Но могу точно сказать, что ошибка выдается в строке var castItem: TestInterface = TestInterface (obj); TypeError: Error # 1034: Type Coercion failed: невозможно преобразовать myPackage :: ExternalTestInterfaceImplementation @ 29b4e6a1 в myPackage.TestInterface. – user432437

ответ

1

Похоже, что это вызвано ошибкой в ​​плеере. Некоторое время назад я столкнулся с этой проблемой. Это описано здесь:

https://bugs.adobe.com/jira/browse/ASC-3529

Там обходной путь, который в основном состоит в загрузке SWF с URLLoader (в двоичном виде), а затем с помощью Loader::loadBytes (вместо того, чтобы просто с помощью обычного Loader).

Вот explantion этого обходного пути и загрузчик классов, который устраняет эту проблему:

http://blog.aleksandarandreev.com/?p=42

+0

Спасибо, что похоже на хорошее место для начала. – user432437

+0

Это определенно исправило проблему, спасибо. Кажется странным, что прошло год с тех пор, как сообщалось об ошибке, и она по-прежнему не исправлена. Интересно, не какая-то странность, о которой не сообщалось ни о контекстах безопасности, ни о чем-то, или о подлинной ошибке. – user432437