现在使用地图.想要向其他实例发送内容的类发送对象即路由字符串.
使用对象流,使用Java serializable将对象写入servlet.
先写字符串然后再写对象.
接收servlet将输入流包装在ObjectInputStream周围.首先读取字符串,然后读取Object.路由字符串决定它去了.
更通用的方法可能是发送类名及其声明的方法或Spring bean名称,但这对我们来说已经足够了.
原始问题
了解基本方法,但需要步骤的详细信息.还知道我可以使用Jaxb或RMI或EJB …但是想使用纯序列化到bytearray然后进行编码,将它从jvm 1中的servlet 1发送到jvm 2中的servlet 2(同一个中的两个app server实例)局域网,在两个J2EE应用程序中设置相同的Java版本和jar)
基本步骤是(Approcah 1): –
>将任何Serializable对象序列化为字节数组并生成字符串.确切的代码见下文
> Base64输出1.是否需要基于64或可以跳过第2步?
>使用java.util.URLEncode.encode对字符串进行编码
>命名参数后,使用apache http组件或URL类从servlet 1发送到2
>在Servlet 2上J2EE框架已经URLDecoced它,现在只需执行反向步骤并根据param名称转换为对象.
既然两者都是我们的应用程序,我们就会知道类型/类映射的param名称.基本上寻找最快的&在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);
解决方法
处理post的servlet可以从HttpServletRequest的ServletInputStream创建的ObjectStream中反序列化.
不过,我建议JAXB随时使用二进制序列化.这些框架不仅非常适合互操作性,还可加快开发速度并创建更强大的解决方案.
我看到的优点是更好的工具,类型安全和代码生成,保持您的选项打开,以便您可以从其他版本或其他语言调用您的代码,并更容易调试.不要低估难以解决因意外地将错误类型或双重转义数据发送到servlet而导致的错误的成本.我希望性能优势太小,无法弥补这一点.