2009-05-17 5 views
0

를 복제 문제 :다음과 같이 내가 ByteArray 클래스를 확장 한 확장 된 ByteArray

[RemoteClass(alias="MyByteArray")] 
public class MyByteArray extends ByteArray {} 

하고이 ByteArray #의 readObject()를 사용하여이 클래스의 인스턴스를 복제 /의 writeObject(). 그러나 어떤 이유로 복제 된 객체는 MyByteArray가 아닌 ByteArray의 인스턴스입니다. 이는 다음 예제에서 설명 :

내가 MyByteArray 클래스에서 일부 사용자 정의 필드를 추가 할 때, 그들은의 writeObject (함께 저장되지)와 어느 쪽도 복제되지 않습니다 또한
registerClassAlias("MyByteArray", MyByteArray); 
var b1:MyByteArray = new MyByteArray(); 
var tmp:ByteArray = new ByteArray(); 
tmp.writeObject(b1);   
tmp.position = 0; 
var b2:* = tmp.readObject(); 
trace(b2 is MyByteArray); // prints false 
trace(b2 is ByteArray); // prints true 

, ...

이 사람이 나를 설명 할 수 복제 된 객체가 MyByteArray의 인스턴스가 아닌 이유는 무엇입니까?

고마워요!

답변

1

tmp가 MyByteArray 유형이 아닌 ByteArray 유형이기 때문입니다. 당신이 MyByteArray 타입의 tmp를 만들면 writeObject를 사용하여 같은 타입의 객체를 반환해야한다고 생각합니까? 또는 그것을 유형 변환해야 할 수도 있습니다.

+0

아니요, tmp는 ByteArray 유형이어야합니다. 이것은 AS3에서 객체를 복제하는 일반적인 방법으로 ObjectUtil.copy()로 구현됩니다. tmp.writeObject()는 MyByteArray의 필드를 저장하지 않으므로 유형 변환이 도움이되지 않습니다 (이 최소한의 예제에서는 MyByteArray에 필드가 없지만 응용 프로그램에 있음). 이상하게도 MyByteArray가 ByteArray를 확장하지 않으면 모든 것이 정상적으로 작동합니다. 즉, b2는 복제 후 MyByteArray 유형입니다. – bartekb

0

ByteArray는 객체 직렬화의 특수한 경우로 취급 될 가능성이 높으므로 주위를 둘러 볼 수 있을지는 의문입니다.

ByteArray를 서브 클래 싱하려고하면 코드 냄새처럼 들립니다. 문제를 해결하기 위해 상속보다는 캡슐화를 사용합니다.

+0

입력 해 주셔서 감사합니다. 나는 의도적으로 상속을 사용했고 캡슐화가 아닌 Flash Player를 조금 속일려고 노력했다. ByteArray 대신 MyByteArray를 FileReference # save() 인수로 전달하려고했는데 데이터를 로컬로 스트리밍 할 수 있기를 바랬다. 파일을 작성하지 말고 (MyByteArray는 실시간으로 데이터를 생성합니다). 여기에이 문제를 설명했습니다 : http://stackoverflow.com/questions/869816/filereference-save-duplicates-bytrayray – bartekb

+0

개체에 IDataInput을 구현해보십시오. 내가 아는 유일한 해결책은 AIR-only (FileStream)입니다. –

+0

그것에 대해 읽은 후, 내용을 ByteArray (IDataOutput을 구현)로 스트리밍하고 나서 ByteArray의 해당 인스턴스를 저장해야하는 것처럼 보입니다. 다시로드하면 IDataInput도 구현됩니다. –