Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.07.2011, 15:42
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 1  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
Question AS3 -> Java, writeObject

Приветствую.
Пытаюсь отправить объект на Java-сервер. Со стандартными типами работает нормально, но с классами начинаются проблемы. Класс сериализирован(и в Java, и в AS), клиент на Java успешно отправляет объект, сервер принимает. При отправке же объекта с Flash-клиента получаю на сервере ошибку:

Код:
java.io.StreamCorruptedException: invalid stream header: 0A071744
Ошибку получаю при попытке создания входного потока:
Код:
try
{
   objectIn = new ObjectInputStream(socket.getInputStream());				
}
catch(StreamCorruptedException e)
{
   System.out.println("Input Error: " + e.toString());
}
Подскажите, пожалуйста, в чем может быть проблема.


Последний раз редактировалось C4Grey; 04.07.2011 в 15:54.
Старый 04.07.2011, 15:54
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 2  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Похоже они сериализованы разными способами.

Старый 04.07.2011, 16:42
t4arty вне форума Посмотреть профиль Отправить личное сообщение для t4arty Найти все сообщения от t4arty
  № 3  
Ответить с цитированием
t4arty

Регистрация: May 2010
Адрес: пространство в положении
Сообщений: 219
кодировка?

Старый 04.07.2011, 18:32
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 4  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
2terbooter

Со связкой Java+Flash я первый раз имею дело, так что вполне возможно, что где-то у меня есть ошибка. Вот исходники:

Flash:

Код AS3:
package  
{	
	import flash.utils.IExternalizable;
	import flash.utils.IDataInput;
	import flash.utils.IDataOutput;	
 
	[RemoteClass(alias="DataMessage")]	
	public class DataMessage implements IExternalizable 
	{		
		public var Message: String;  
		public var X:int;
		public var Y:int;
		private var _id:String;
 
		public function DataMessage()
		{
		}
 
		public function get id():String
		{
			return _id;
		}
 
		public function readExternal(input:IDataInput):void
		{
			_id = input.readObject() as String;
			Message = input.readObject() as String;
			X = input.readInt();
			Y = input.readInt();
		}
 
		public function writeExternal(output:IDataOutput):void
		{
			output.writeObject(id);
			output.writeObject(Message);
			output.writeInt(X);
			output.writeInt(Y);
		}
	}	
}
Регистрирую в главном классе:

Код AS3:
private static const REG:* = registerClassAlias("DataMessage", DataMessage);
Java:

Код:
package FlashServer;

import java.io.Serializable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class DataMessage implements Serializable
{
	private static final long serialVersionUID = 1L;
    public String Message;
    public int X;
    public int Y;
    private String id;
    
	public DataMessage() 
	{
		id = hashCode() + "X" + System.currentTimeMillis();
	}
	
    public String getId()
    {
        return id;
    }

    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
    {
        id = (String)in.readObject();
        Message = (String)in.readObject();
        X = (int)in.readInt();
        Y = (int)in.readInt();
    }	
    
    public void writeExternal(ObjectOutput out) throws IOException
    {
        out.writeObject(id);
        out.writeObject(Message);
        out.writeInt(X);
        out.writeInt(Y);
    }	

}
serialVersionUID пробовал также генерировать рандомный(Eclipse предлагает генерацию или использование такого ID по умолчанию), ошибка остается.

2t4arty
Насколько я понял мануалы, в Java кодировку можно указывать для BufferedReader, а он со строками рабоатет.


Последний раз редактировалось C4Grey; 04.07.2011 в 18:34.
Старый 04.07.2011, 18:42
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 5  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Эмм... Actionscript записывает объекты в формате AMF, а java читает их по своим понятиям о сериализации... Разве это должно работать?
Я думаю, нужно либо писать свой формат и реализовать его и на сервере, и на клиенте, или прикрутить AMF к java - BlazeDS, например
__________________
...вселенская грусть

Старый 04.07.2011, 19:00
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 6  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
2gloomyBrain
C хелпа BlazeDS:
Цитата:
For Java objects that BlazeDS does not handle implicitly, values found in public bean properties with get/set methods and public variables are sent to the client as properties on an Object. Private properties, constants, static properties, and read-only properties, and so on, are not serialized. For ActionScript objects, public properties defined with the get/set accessors and public variables are sent to the server.

BlazeDS uses the standard Java class, java.beans.Introspector, to get property descriptors for a Java bean class. It also uses reflection to gather public fields on a class. It uses bean properties in preference to fields. The Java and ActionScript property names should match. Native Flash Player code determines how ActionScript classes are introspected on the client.

In the ActionScript class, you use the [RemoteClass(alias=" ")] metadata tag to create an ActionScript object that maps directly to the Java object. The ActionScript class to which data is converted must be used or referenced in the MXML file for it to be linked into the SWF file and available at run time.
Отсюда: http://livedocs.adobe.com/blazeds/1/...ze_data_3.html

Старый 04.07.2011, 22:59
Vier вне форума Посмотреть профиль Отправить личное сообщение для Vier Посетить домашнюю страницу Vier Найти все сообщения от Vier
  № 7  
Ответить с цитированием
Vier

Регистрация: Sep 2004
Сообщений: 90
Кодировки бывают только у текста, вам передается в любом случае бинарник. serialVersionUID у сериализованного файла по идее должен совпадать. Если бинов не много я бы не морочился и передавал все, как HashMap (если коллекции корректно работают).

Старый 05.07.2011, 10:24
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 8  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Java сериализация - AMF сериализация
Нужен парсер, чтобы перегонять один формат в другой.
Так ли вам важно маппить классы с помощью registerClassAlias?
Может проще использовать свой формат?

Старый 05.07.2011, 12:06
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 9  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
2Vier
Вот в этом багтреке: http://bugs.sun.com/bugdatabase/view...bug_id=4968673 описывается решение похожей проблемы, но там потоки работают через ByteArray, в одном и том же приложении. Причиной возникновения ошибки называют как раз несовпадение кодировок, если я верно понял. Да, и можно ли конкретнее, как работать с HashMap?
2terbooter
Ну, в общем-то сервер-клиент у меня уже написаны, так сказать, одноразовая реализация, для конкретного проекта...а сейчас на эксперемнты потянуло, как прочитал о возможности подобной передачи объектов. Согласитесь, было бы удобно.


Последний раз редактировалось C4Grey; 05.07.2011 в 17:11.
Старый 05.07.2011, 12:50
Vier вне форума Посмотреть профиль Отправить личное сообщение для Vier Посетить домашнюю страницу Vier Найти все сообщения от Vier
  № 10  
Ответить с цитированием
Vier

Регистрация: Sep 2004
Сообщений: 90
Цитата:
Сообщение от C4Grey Посмотреть сообщение
2Vier
Вот в этом багтреке: http://bugs.sun.com/bugdatabase/view...bug_id=4968673 описывается решение похожей проблемы, но там потоки работают через ByteArray, в одном и том же приложении. Причиной возникновения ошибки называют как раз несовпадение кодировок, если я верно понял. Да, и можно ли конкретнее, как работать с HashMap?
C4Grey, давно ничего не сериализовал в яве, но как видно ObjectInput у вас, это поток байт, у них нет кодировки как таковой ) А по ссылке бинарник с сериализованным классом представляют в виде строки, а потом делают обратное преобразование. Такой маневр в яве:
String serialized = baos.toString();
byte[] b = serialized.getBytes();
Действительно может убить кодировку.


Кодировка могла слететь только на конкретных полях, где пишется out.writeObject(Message); и читается Message = (String)in.readObject();. В общем, у вас скорее всего проблема с форматом сериализации. Просто сериализуйте класс в яве и во флеше и сравните байты )

Насчет HashMap'а вы сказали, что со стандартными типами все ок. Не очень понятно, что такое стандартные типы, возможно коллекции входят в них ))

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 00:13.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.