1

私がやろうとしているのは、Webサービスからモバイルクライアントに画像を転送することです。これを行うために、byte[]変数を返すWebサービス操作を作成しました。この方法では、チャートから.png画像を作成します。この後、画像からバイトを取得し、操作の戻り値として提供します。これはサーバーコードです:

public byte[] getBytes() throws IOException { 

BufferedImage chartImage = chart.createBufferedImage(230, 260); 
//I get the image from a chart component. 
ByteArrayOutputStream baos = new ByteArrayOutputStream(1000); 


ImageIO.write( chartImage, "png",baos ); 


baos.flush(); 
byte[] bytesImage = baos.toByteArray(); 

baos.close(); 

return bytesImage; 
} 

Now in the mobile application all i do is assign a byte[] variable the return value of the web service operation.

byte[] imageBytes = Stub.getBytes().

何かが足りないかもしれませんが、このランタイムエラーが発生するため、これは機能しません。

java.rmi.MarshalException: Expected Byte, received: iVBORw0KGgoAAAANSUhEU.... (very long line).

なぜこれが起こったのか考えがありますか?または、モバイルクライアントにデータを送信する他の方法を提案することもできます。

4

1 に答える 1

4

サービスが画像をバイト配列としてのみ配信している場合、これをSOAP応答でラップすることによってオーバーヘッドが発生し、クライアント側でのXML/SOAP解析はかなり不要に見えます。チャート生成をサーブレットに実装し、クライアントに「非SOAP」サーバーURLから画像を取得させてみませんか?

WebServiceメソッドからbytesImageを返す代わりに、サーブレットの応答オブジェクトにバイト配列を書き込むことができます。

response.setContentType("image/png");
response.setContentLength(bytesImage.length);
OutputStream os = response.getOutputStream();
os.write(bytesImage);
os.close();

J2MEクライアントでは、サーブレットがバインドされているURLから応答を読み取り、データからイメージを作成します。

HttpConnection conn = (HttpConnection)Connector.open("http://<servlet-url>");
DataInputStream dis = conn.openDataInputStream();
byte[] buffer = new byte[conn.getLength()];
dis.readFully(buffer);
Image image = Image.createImage(buffer, 0, buffer.length);

お役に立てれば!

于 2009-09-29T14:22:54.227 に答える