![]() |
|
||||||||||
|
|||||
|
Приветствую.
Пытаюсь отправить объект на Java-сервер. Со стандартными типами работает нормально, но с классами начинаются проблемы. Класс сериализирован(и в Java, и в AS), клиент на Java успешно отправляет объект, сервер принимает. При отправке же объекта с Flash-клиента получаю на сервере ошибку: Ошибку получаю при попытке создания входного потока: Подскажите, пожалуйста, в чем может быть проблема. Последний раз редактировалось C4Grey; 04.07.2011 в 15:54. |
|
|||||
|
Похоже они сериализованы разными способами.
__________________
Сам себе репортер |
|
|||||
|
Регистрация: May 2010
Адрес: пространство в положении
Сообщений: 219
|
кодировка?
|
|
|||||
|
2terbooter
Со связкой Java+Flash я первый раз имею дело, так что вполне возможно, что где-то у меня есть ошибка. Вот исходники: Flash: 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); } } } 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);
}
}
2t4arty Насколько я понял мануалы, в Java кодировку можно указывать для BufferedReader, а он со строками рабоатет. Последний раз редактировалось C4Grey; 04.07.2011 в 18:34. |
|
|||||
|
Эмм... Actionscript записывает объекты в формате AMF, а java читает их по своим понятиям о сериализации... Разве это должно работать?
Я думаю, нужно либо писать свой формат и реализовать его и на сервере, и на клиенте, или прикрутить AMF к java - BlazeDS, например
__________________
...вселенская грусть |
|
|||||
|
2gloomyBrain
C хелпа BlazeDS: Цитата:
|
|
|||||
|
Регистрация: Sep 2004
Сообщений: 90
|
Кодировки бывают только у текста, вам передается в любом случае бинарник. serialVersionUID у сериализованного файла по идее должен совпадать. Если бинов не много я бы не морочился и передавал все, как HashMap (если коллекции корректно работают).
|
|
|||||
|
Java сериализация - AMF сериализация
Нужен парсер, чтобы перегонять один формат в другой. Так ли вам важно маппить классы с помощью registerClassAlias? Может проще использовать свой формат?
__________________
Сам себе репортер |
|
|||||
|
2Vier
Вот в этом багтреке: http://bugs.sun.com/bugdatabase/view...bug_id=4968673 описывается решение похожей проблемы, но там потоки работают через ByteArray, в одном и том же приложении. Причиной возникновения ошибки называют как раз несовпадение кодировок, если я верно понял. Да, и можно ли конкретнее, как работать с HashMap? 2terbooter Ну, в общем-то сервер-клиент у меня уже написаны, так сказать, одноразовая реализация, для конкретного проекта...а сейчас на эксперемнты потянуло, как прочитал о возможности подобной передачи объектов. Согласитесь, было бы удобно. Последний раз редактировалось C4Grey; 05.07.2011 в 17:11. |
|
|||||
|
Регистрация: Sep 2004
Сообщений: 90
|
Цитата:
String serialized = baos.toString(); byte[] b = serialized.getBytes(); Действительно может убить кодировку. Кодировка могла слететь только на конкретных полях, где пишется out.writeObject(Message); и читается Message = (String)in.readObject();. В общем, у вас скорее всего проблема с форматом сериализации. Просто сериализуйте класс в яве и во флеше и сравните байты ) Насчет HashMap'а вы сказали, что со стандартными типами все ок. Не очень понятно, что такое стандартные типы, возможно коллекции входят в них )) |
![]() |
![]() |
Часовой пояс GMT +4, время: 00:13. |
|
|
« Предыдущая тема | Следующая тема » |
|
|