现在使用地图.想要向其他实例发送内容的类发送对象即路由字符串.
使用对象流,使用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而导致的错误的成本.我希望性能优势太小,无法弥补这一点.