使用序列化将对象传递给另一个JVM – 相同的Java版本和jar(都运行我们的应用程序)

前端之家收集整理的这篇文章主要介绍了使用序列化将对象传递给另一个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对象序列化为字节数组并生成字符串.确切的代码见下文
> Base64输出1.是否需要基于64或可以跳过第2步?
>使用java.util.URLEncode.encode对字符串进行编码
>命名参数后,使用apache http组件或URL类从servlet 1发送到2
>在Servlet 2上J2EE框架已经URLDecoced它,现在只需执行反向步骤并根据param名称转换为对象.
既然两者都是我们的应用程序,我们就会知道类型/类映射的param名称.基本上寻找最快的&在JVM之间发送对象的最方便的方法.

示例:
POJO类发送

  1. package tst.ser;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class Bean1 implements Serializable {
  6. /**
  7. * make it 2 if add something without default handling
  8. */
  9. private static final long serialVersionUID = 1L;
  10. private String s;
  11.  
  12. public String getS() {
  13. return s;
  14. }
  15.  
  16. public void setS(String s) {
  17. this.s = s;
  18. }
  19.  
  20. }

* 效用 *

  1. package tst.ser;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.ObjectInputStream;
  6. import java.io.ObjectOutputStream;
  7. import java.net.URLEncoder;
  8.  
  9. public class SerUtl {
  10.  
  11. public static String serialize(Object o) {
  12. String s = null;
  13. ObjectOutputStream os = null;
  14. try {
  15. os = new ObjectOutputStream(new ByteArrayOutputStream());
  16. os.writeObject(o);
  17. s = BAse64.encode(os.toByeArray());
  18.  
  19.  
  20. //s = URLEncoder.encode(s,"UTF-8");//keep this for sending part
  21.  
  22. } catch (Exception e) {
  23. // TODO: logger
  24. e.printStackTrace();
  25. return null;
  26. } finally {
  27. // close OS but is in RAM
  28. try {
  29. os.close();// not required in RAM
  30. } catch (Exception e2) {// TODO: handle exception logger
  31. }
  32. os = null;
  33. }
  34. return s;
  35. }
  36.  
  37. public static Object deserialize(String s) {
  38. Object o = null;
  39. ObjectInputStream is = null;
  40.  
  41. try {
  42. // do base 64 decode if done in serialize
  43. is = new ObjectInputStream(new ByteArrayInputStream(
  44. Base64.decode(s)));
  45. o = is.readObject();
  46. } catch (Exception e) {
  47. // TODO: logger
  48. e.printStackTrace();
  49. return null;
  50. } finally {
  51. // close OS but is in RAM
  52. try {
  53. is.close();// not required in RAM
  54. } catch (Exception e2) {// TODO: handle exception logger
  55. }
  56. is = null;
  57. }
  58. return o;
  59. }
  60.  
  61. }

****样本发送servlet ***

  1. Bean1 b = new Bean1(); b.setS("asdd");
  2. String s = SerUtl.serialize(b);
  3. //do UrlEncode.encode here if sending lib does not.
  4. HttpParam p = new HttpParam ("bean1",s);
  5. //http components send obj

****样本接收servlet ***

  1. String s = request.getParameter("bean1");
  2. Bean1 b1 = (Beean1)SerUtl.deserialize(s);

解决方法

您无需转换为字符串.您可以将二进制数据直接发布到servlet,例如通过在 HttpUrlConnection输出流之上创建ObjectOutputStream.将请求方法设置为POST.

处理post的servlet可以从HttpServletRequest的ServletInputStream创建的ObjectStream中反序列化.

不过,我建议JAXB随时使用二进制序列化.这些框架不仅非常适合互操作性,还可加快开发速度并创建更强大的解决方案.

我看到的优点是更好的工具,类型安全和代码生成,保持您的选项打开,以便您可以从其他版本或其他语言调用您的代码,并更容易调试.不要低估难以解决因意外地将错误类型或双重转义数据发送到servlet而导致的错误的成本.我希望性能优势太小,无法弥补这一点.

猜你在找的JVM相关文章