AS3 не может декодировать объект AMF3 из сокета, отправленного Java - PullRequest
4 голосов
/ 04 июля 2011

У меня есть сервер сокетов Java, который при подключении отправляет объект Animal клиенту Flash.Объект отправляется так:

Amf3Output amf3Output = new Amf3Output(SerializationContext.getSerializationContext());
amf3Output.setOutputStream(userSocket.getOutputStream());
amf3Output.writeObject(animal);

И код на стороне флэш-памяти:

var object:Object = socket.readObject();
trace(object);
trace(object as Animal);

Однако, когда второй след дает мне ноль

Я проверил, что java отправляет 31 байт, а Flash получает 31 байт.

Возможно, мои классы Java и AS3 не соответствуют требованиям AMF.

Класс Java:

package main;

public class Animal {

   public String name;
   public int age;
}

Класс AS3:

package  
{

    [Bindable]
    [RemoteClass(alias="main.Animal")]
    public class Animal 
    {
        public var name:String;
        public var age:int;

    }

}

Ответы [ 3 ]

2 голосов
/ 07 июля 2011

Я не знаком с Java и сериализаторами / десериализаторами AMF, доступными для него, но отправка типизированных объектов через сокеты действительно поддерживается во флэш-памяти и работает правильно, если вы отправляете нужные данные.Ниже приведен пример сокет-сервера в ruby, взаимодействующего с приложением Flash.Я использую RocketAMF для отправки объекта AMF3 через сокет клиенту после его подключения.

SocketTest.as:

package {
    import flash.display.Sprite;
    import flash.net.registerClassAlias;
    import org.rackAMF.*;
    import flash.net.Socket;
    import flash.events.*;

    public class SocketTest extends Sprite {
        private var socket:Socket;

        public function SocketTest() {
            registerClassAlias('Animal', Animal);

            socket = new Socket();
            socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
            socket.connect("localhost", 8081);
        }

        private function onResponse(e:ProgressEvent):void {
            var animal:Animal = socket.readObject() as Animal;
            trace(Object(animal).constructor); // [trace] [class Animal]
            trace(animal.name); // [trace] Zebra
            trace(animal.age); // [trace] 5
        }
    }
}

class Animal {
    public var name:String;
    public var age:int;
}

socket_server.рб:

require 'rubygems'
require 'socket'
require 'rocketamf'

class Animal
  attr_accessor :name, :age
end

# Map "Animal" in ruby to "Animal" in flash
RocketAMF::ClassMapper.define do |m|
  m.map :as => 'Animal', :ruby => 'Animal'
end

server = TCPServer.open(8081)
loop {
  client = server.accept

  animal = Animal.new
  animal.name = "Zebra"
  animal.age = 5
  client.write RocketAMF.serialize(animal, 3)

  client.close
}
0 голосов
/ 05 июля 2011

Поскольку вы приняли участие в BlazeDS, трудно определить, какие требования предъявляются к AMF3 по сравнению с требованиями BlazeDS.Что я скажу, так это то, что BlazeDS нужны классы Java, которые соответствуют спецификации Java Beans, а это означает совпадение методов получения и установки.

Я также предполагаю, что на стороне Flex требуется больше для десериализации полезной нагрузки AMF3: формат «на проводе» не является объектом Actionscript 3.0.Я сделал несколько пользовательских сериализаций BlazeDS, поэтому я думаю, что вы упускаете что-то на стороне Flex.

Есть ли причина, по которой вы не используете BlazeDS (или GraniteDS) для связи?

0 голосов
/ 04 июля 2011

Вы проверили, что objectEncoding установлено на 3 на стороне ActionScript? Если вы отправляете данные AMF3 и пытаетесь прочитать данные AMF0, это не сработает.

...