使用序列化将对象传递给另一个JVM – 相同的Java版本和jar(都运
更新:
现在使用地图.想要向其他实例发送内容的类发送对象即路由字符串. 使用对象流,使用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对象序列化为字节数组并生成字符串.确切的代码见下文 示例: 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); 解决方法
您无需转换为字符串.您可以将二进制数据直接发布到servlet,例如通过在
HttpUrlConnection的输出流之上创建ObjectOutputStream.将请求方法设置为POST.
处理post的servlet可以从HttpServletRequest的ServletInputStream创建的ObjectStream中反序列化. 不过,我建议JAXB随时使用二进制序列化.这些框架不仅非常适合互操作性,还可加快开发速度并创建更强大的解决方案. 我看到的优点是更好的工具,类型安全和代码生成,保持您的选项打开,以便您可以从其他版本或其他语言调用您的代码,并更容易调试.不要低估难以解决因意外地将错误类型或双重转义数据发送到servlet而导致的错误的成本.我希望性能优势太小,无法弥补这一点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |