При приведении объекта с использованием «as» возвращается значение null: myObject = newObject as MyObject; // ноль - PullRequest
1 голос
/ 03 мая 2010

Я пытаюсь создать пользовательский объект в AS3 для передачи информации на сервер и с сервера, который в этом случае будет Red5. На скриншотах ниже вы увидите, что я могу отправить запрос на объект из as3 и успешно получить его с сервера Java. Однако, когда я пытаюсь привести полученный объект к определенному объектному типу, используя 'as', он принимает значение null. Насколько я понимаю, при использовании «as» вы проверяете, является ли ваша переменная членом указанного типа данных. Если переменная отсутствует, будет возвращено значение null.

Этот снимок экрана показывает, что я успешно получил свой объект 'o' от red5, и я собираюсь привести его к (предположительно) идентичному объекту типа testObject из LobbyData:

alt text Увеличить

Однако, когда запускается testObject = o as LobbyData;, возвращается ноль. (

alt text Увеличить

Ниже вы увидите мои спецификации как на java-сервере, так и на клиенте as3. Я уверен, что оба объекта идентичны во всех отношениях, но почему-то Flash так не считает. Я давно выдергиваю волосы, у кого-нибудь есть мысли?

AS3 Объект:

import flash.utils.IDataInput;
 import flash.utils.IDataOutput;
 import flash.utils.IExternalizable;
 import flash.net.registerClassAlias; 

 [Bindable]
 [RemoteClass(alias = "myLobbyData.LobbyData")]
 public class LobbyData implements IExternalizable
 { 

 private var sent:int; // java sentinel
 private var u:String; // red5 username
 private var sen:int; // another sentinel?
 private var ui:int;  // fb uid
 private var fn:String; // fb name
 private var pic:String; // fb pic
 private var inb:Boolean; // is in the table?
 private var t:int; // table number
 private var s:int; // seat number

 public function setSent(sent:int):void 
 {
  this.sent = sent;
 }

 public function getSent():int
 {
  return sent;
 }  

 public function setU(u:String):void
 {
  this.u = u;
 }

 public function getU():String
 {
  return u;
 }  

 public function setSen(sen:int):void
 {
  this.sen = sen;
 }

 public function getSen():int
 {
  return sen;
 }  

 public function setUi(ui:int):void
 {
  this.ui = ui;
 }

 public function getUi():int
 {
  return ui;
 }

 public function setFn(fn:String):void
 {
  this.fn = fn;
 }

 public function getFn():String
 {
  return fn;
 }

 public function setPic(pic:String):void
 {
  this.pic = pic;
 }

 public function getPic():String
 {
  return pic;
 }  

 public function setInb(inb:Boolean):void
 {
  this.inb = inb;
 }

 public function getInb():Boolean
 {
  return inb;
 }  

 public function setT(t:int):void
 {
  this.t = t;
 }

 public function getT():int
 {
  return t;
 }

 public function setS(s:int):void
 {
  this.s = s;
 }

 public function getS():int
 {
  return s;
 }

 public function readExternal(input:IDataInput):void
 {
  sent = input.readInt();
  u = input.readUTF();
  sen = input.readInt();
  ui = input.readInt();
  fn = input.readUTF();
  pic = input.readUTF();
  inb = input.readBoolean();
  t = input.readInt();
  s = input.readInt();  
 }


 public function writeExternal(output:IDataOutput):void
 {
  output.writeInt(sent);
  output.writeUTF(u);
  output.writeInt(sen);
  output.writeInt(ui);
  output.writeUTF(fn);
  output.writeUTF(pic);
  output.writeBoolean(inb);
  output.writeInt(t);
  output.writeInt(s);
 }
    }

Java-объект:

    package myLobbyData;
    import org.red5.io.amf3.IDataInput;
    import org.red5.io.amf3.IDataOutput;
    import org.red5.io.amf3.IExternalizable;




    public class LobbyData implements IExternalizable
    {
 private static final long serialVersionUID = 115280920;

 private int sent; // java sentinel
 private String u; // red5 username
 private int sen; // another sentinel?
 private int ui;  // fb uid
 private String fn; // fb name
 private String pic; // fb pic
 private Boolean inb; // is in the table?
 private int t; // table number
 private int s; // seat number

 public void setSent(int sent)
 {
  this.sent = sent;
 }

 public int getSent()
 {
  return sent;
 }  

 public void setU(String u)
 {
  this.u = u;
 }

 public String getU()
 {
  return u;
 }  

 public void setSen(int sen)
 {
  this.sen = sen;
 }

 public int getSen()
 {
  return sen;
 }  

 public void setUi(int ui)
 {
  this.ui = ui;
 }

 public int getUi()
 {
  return ui;
 }

 public void setFn(String fn)
 {
  this.fn = fn;
 }

 public String getFn()
 {
  return fn;
 }

 public void setPic(String pic)
 {
  this.pic = pic;
 }

 public String getPic()
 {
  return pic;
 }  

 public void setInb(Boolean inb)
 {
  this.inb = inb;
 }

 public Boolean getInb()
 {
  return inb;
 }  

 public void setT(int t)
 {
  this.t = t;
 }

 public int getT()
 {
  return t;
 }

 public void setS(int s)
 {
  this.s = s;
 }

 public int getS()
 {
  return s;
 }



 @Override
 public void readExternal(IDataInput input) 
 {
  sent = input.readInt();
  u = input.readUTF();
  sen = input.readInt();
  ui = input.readInt();
  fn = input.readUTF();
  pic = input.readUTF();
  inb = input.readBoolean();
  t = input.readInt();
  s = input.readInt();  
 }

 @Override
 public void writeExternal(IDataOutput output)
 {
  output.writeInt(sent);
  output.writeUTF(u);
  output.writeInt(sen);
  output.writeInt(ui);
  output.writeUTF(fn);
  output.writeUTF(pic);
  output.writeBoolean(inb);
  output.writeInt(t);
  output.writeInt(s);
 }

    }

AS3 Клиент:

public function refreshRoom(event:Event)
{
var resp:Responder=new Responder(handleResp,null);
ncLobby.call("getLobbyData", resp, null);
}
public function handleResp(o:Object):void
{
var testObject:LobbyData=new LobbyData;    
testObject = o as LobbyData;  
trace(testObject);
}

Java-клиент

 public LobbyData getLobbyData(String param)
 {
LobbyData lobbyData1 = new LobbyData();
 lobbyData1.setSent(5);
 lobbyData1.setU("lawlcats");
 lobbyData1.setSen(5);
 lobbyData1.setUi(5);
 lobbyData1.setFn("lulz");
 lobbyData1.setPic("lulzagain");
 lobbyData1.setInb(true);
 lobbyData1.setT(5);
 lobbyData1.setS(5);
 return lobbyData1;
}

Ответы [ 3 ]

2 голосов
/ 05 мая 2010

Как вы уже поняли, вы должны использовать registerClassAlias, поскольку RemoteClass работает из коробки только для проектов Flex (как привязываемых и т. Д.).

Обязательно вызовите registerClassAlias ​​до того, как произойдет любая сериализация / десериализация.

Кроме того, отладчик показывает фактическую подсказку параметра «o», который является объектом. Это показывает, что проигрыватель неправильно отображает класс сериализованного объекта AMF ни в один из ваших классов (поэтому, по умолчанию, он идет с Object). Вы должны увидеть объект LobbyData в отладчике; в противном случае, независимо от того, как вы его разыгрываете / заставляете, это не сработает.

0 голосов
/ 02 апреля 2011

На самом деле, если вы хотите обойти приведение типов, вы можете просто добавить это к своему конструктору:

публичная функция dataAwareObject (o: * = null) { // TODO: реализовать функцию супер(); если (о) { для (var a: * in o) это [а] = о [а]; } } }

Работает как шарм.

0 голосов
/ 04 мая 2010

Объект должен быть объявлен до вызова ответчика.

public function refreshRoom(event:Event)
{
var testObject:LobbyData=new LobbyData;
var resp:Responder=new Responder(handleResp,null);
ncLobby.call("getLobbyData", resp, null);
}
public function handleResp(o:Object):void
{

testObject = o as LobbyData;  
trace(testObject);
}
...