更新:现在使用地图。想要向其他实例发送内容的类发送对象,即路由字符串。
使用对象流,使用 Java 可序列化将对象写入 servlet。
先写字符串,再写对象。
接收 servlet 将输入流包装在 ObjectInputStream 周围。首先读取字符串,然后读取对象。路由字符串决定它是否进行。
一种更通用的方法可能是发送一个类名及其声明的方法或一个 Spring bean 名,但这对我们来说已经足够了。
原始问题
了解基本方法,但需要详细步骤。也知道我可以使用 Jaxb 或 RMI 或 EJB ...但想使用纯序列化到字节数组来执行此操作,然后将其从 jvm 1 中的 servlet 1 发送到 jvm 2 中的 servlet 2(两个应用程序服务器实例在同一个LAN,在两个 J2EE 应用程序中设置相同的 Java 版本和 jars)
基本步骤是(Appprocah 1):-
将任何 Serializable 对象序列化为字节数组并创建一个字符串。具体代码见下
1 的 Base64 输出。是否需要以 64 为基数或可以跳过第 2 步?
使用 java.util.URLEncode.encode 对字符串进行编码
在命名参数后使用 apache http 组件或 URL 类从 servlet 1 发送到 2
在 Servlet 2 J2EE 框架上已经对它进行了 URLDecoced,现在只需执行相反的步骤并根据参数名称强制转换为对象。由于两者都是我们的应用程序,我们将知道类型/类映射的参数名称。基本上是在寻找在 JVM 之间发送对象的最快和最方便的方式。
示例:要发送的 POJO 类
package tst.ser;
import java.io.Serializable;
public class Bean1 implements Serializable {
/**
* make it 2 if add something without default handling
*/
private static final long serialVersionUID = 1L;
private String s;
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
}
* 效用 *
package tst.ser;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URLEncoder;
public class SerUtl {
public static String serialize(Object o) {
String s = null;
ObjectOutputStream os = null;
try {
os = new ObjectOutputStream(new ByteArrayOutputStream());
os.writeObject(o);
s = BAse64.encode(os.toByeArray());
//s = URLEncoder.encode(s, "UTF-8");//keep this for sending part
} catch (Exception e) {
// TODO: logger
e.printStackTrace();
return null;
} finally {
// close OS but is in RAM
try {
os.close();// not required in RAM
} catch (Exception e2) {// TODO: handle exception logger
}
os = null;
}
return s;
}
public static Object deserialize(String s) {
Object o = null;
ObjectInputStream is = null;
try {
// do base 64 decode if done in serialize
is = new ObjectInputStream(new ByteArrayInputStream(
Base64.decode(s)));
o = is.readObject();
} catch (Exception e) {
// TODO: logger
e.printStackTrace();
return null;
} finally {
// close OS but is in RAM
try {
is.close();// not required in RAM
} catch (Exception e2) {// TODO: handle exception logger
}
is = null;
}
return o;
}
}
**** 样本发送 servlet ***
Bean1 b = new Bean1(); b.setS("asdd");
String s = SerUtl.serialize(b);
//do UrlEncode.encode here if sending lib does not.
HttpParam p = new HttpParam ("bean1", s);
//http components send obj
**** 样本接收 servlet ***
String s = request.getParameter("bean1");
Bean1 b1 = (Beean1)SerUtl.deserialize(s);