首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Axis2 系列教程(二):複合類型數據傳遞與序列化技巧

     編輯:Java 相關知識

複合類型概述

Axis2 原生支援陣列與自訂類別(介面)作為方法參數或回傳值。陣列僅限一維,多維陣列可透過分隔符(如逗號)在一維字串陣列中模擬。

服務端實作:ComplexTypeService

import java.io.*;
import data.DataForm;

public class ComplexTypeService {
    // 位元組陣列上傳圖片
    public boolean uploadImageWithByte(byte[] imageByte, int length) {
        try (FileOutputStream fos = new FileOutputStream("d:\\test1.jpg")) {
            fos.write(imageByte, 0, length);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    // 回傳一維字串陣列
    public String[] getArray() {
        return new String[] { "自行車", "飛機", "火箭" };
    }

    // 模擬二維陣列:以逗號分隔
    public String[] getMDArray() {
        return new String[] {
            "自行車,飛機,火箭",
            "中國,美國,德國",
            "超人,蜘蛛俠,鋼鐵俠"
        };
    }

    // 回傳自訂物件
    public DataForm getDataForm() {
        return new DataForm();
    }

    // 物件序列化為 byte[]
    public byte[] getDataFormBytes() throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(new DataForm());
        return baos.toByteArray();
    }
}

DataForm 實體類(需實作 Serializable)

package data;

public class DataForm implements java.io.Serializable {
    private String name = "bill";
    private int age = 20;
    // getter/setter 略
}

部署步驟

  1. DataForm.class → WEB-INF/classes/data
  2. ComplexTypeService.class → WEB-INF/pojo
  3. 重啟 Tomcat(新增類別需重載)。

Java RPC 客戶端調用

RPCServiceClient client = new RPCServiceClient();
Options options = client.getOptions();
options.setTo(new EndpointReference("https://localhost:8080/axis2/services/ComplexTypeService"));

// 上傳圖片
File file = new File("f:\\images.jpg");
byte[] buffer = new byte[(int) file.length()];
new FileInputStream(file).read(buffer);
Object[] args = { buffer, buffer.length };
Class[] retTypes = { Boolean.class };
QName op = new QName("https://ws.apache.org/axis2", "uploadImageWithByte");
System.out.println(client.invokeBlocking(op, args, retTypes)[0]);

// 獲取一維陣列
op = new QName("https://ws.apache.org/axis2", "getArray");
String[] arr = (String[]) client.invokeBlocking(op, new Object[]{}, new Class[]{String[].class})[0];

// 解析模擬二維陣列
op = new QName("https://ws.apache.org/axis2", "getMDArray");
arr = (String[]) client.invokeBlocking(op, new Object[]{}, new Class[]{String[].class})[0];
for (String row : arr) {
    for (String col : row.split(",")) System.out.print("<" + col + "> ");
    System.out.println();
}

// 直接獲取物件
op = new QName("https://ws.apache.org/axis2", "getDataForm");
DataForm df = (DataForm) client.invokeBlocking(op, new Object[]{}, new Class[]{DataForm.class})[0];

// 反序列化物件
op = new QName("https://ws.apache.org/axis2", "getDataFormBytes");
buffer = (byte[]) client.invokeBlocking(op, new Object[]{}, new Class[]{byte[].class})[0];
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer));
df = (DataForm) ois.readObject();

C# 客戶端調用

  • 陣列與基本類型直接對應。
  • DataGridView 綁定模擬二維陣列:以 Split(',') 拆分字串後逐行加入。
  • 序列化物件僅限同平台:Java/.NET 序列化格式不相容,跨平台請改用 XML/JSON。

效能建議

大檔案傳輸請改用 FTP/SFTP,Web Service 僅傳遞元資料;避免在 RPC 中傳輸巨大位元組陣列造成記憶體壓力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved