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