2017-09-01 33 views
0

我想从Swing应用程序发送HashMap到Web Application.HashMap类型为。它包含一个字符串,ArrayList和字节数组。我想在Web应用程序中检索此地图。使用URLConnection发送和检索地图

摇摆端代码:

private static void sendMap() 
    { 
     System.out.println("Sending MAP"); 
     byte[] bytes=getByteArray(); 
     ArrayList<String> list =new ArrayList<String>(); 
     list.add("ABC"); 
     list.add("XYZ"); 
     list.add("ABXY"); 
     Map<String, Object> params=new HashMap<String, Object>(); 
     params.put("Type", "Document"); 
     params.put("bytes", bytes); 
     params.put("PartyNameList", list); 

     try { 
      URL url= new URL(iinkiturl+"/getMap?id=1234567"); 
      URLConnection uc = url.openConnection(); 
      uc.setDoOutput(true); 
      uc.setDoInput(true); 
      uc.setAllowUserInteraction(false); 

      DataOutputStream dstream = new DataOutputStream(uc.getOutputStream()); 

      // The POST line 
      System.out.println(toByteArray(params)); 
      dstream.write(params.toString().getBytes()); 
      dstream.close(); 

      InputStream in = uc.getInputStream(); 
      int x; 
      while ((x = in.read()) != -1) { 
       System.out.write(x); 
      } 
      in.close(); 

      BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
      StringBuffer buf = new StringBuffer(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       buf.append(line); 
      } 


     } catch(Exception exception) 
     { 
      exception.printStackTrace(); 
     } 


    } 

Web应用程序端:

 InputStream in = request.getInputStream(); 
     BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
     StringBuffer buf = new StringBuffer(); 
     String line; 
     while ((line = r.readLine())!=null) { 
     buf.append(line); 
     } 
     System.out.println("Buffer ======= "+buf.toString()); 

输出:

缓冲======= {类型=归档,PartyNameList = [ABC, XYZ,ABXY],字节= [B @ 24c0f1ec}

如何从此缓冲区获取Map对象。或者是否有任何替代解决方案来实现这一点。提前致谢。

+1

见XML或JSON对象,而相应的API,以生产和在Java中使用它们... –

+0

使用Arrays.toString到修复字节数组 –

+0

通常项目在某个框架上增长。几乎所有人都有对编码/解码参数的概念。 –

回答

0

我的问题是使用JSON解决的。

摇摆端代码:

private static void sendMap() 
    { 
     System.out.println("Sending MAP"); 
     ArrayList<String> list =new ArrayList<String>(); 
     list.add("ABC"); 
     list.add("XYZ"); 
     list.add("ABXY"); 
     Map<String, Object> params=new HashMap<String, Object>(); 
     params.put("Type", "Document"); 
     params.put("bytes", getByteArray()); 
     params.put("NameList", list); 

     try { 
      URL url= new URL(iinkiturl+"/getMap?id=1234567"); 
      URLConnection uc = url.openConnection(); 
      uc.setDoOutput(true); 
      uc.setDoInput(true); 
      uc.setAllowUserInteraction(false); 

      DataOutputStream dstream = new DataOutputStream(uc.getOutputStream()); 

      dstream.write(new com.google.gson.Gson().toJson(params).getBytes()); 
      dstream.close(); 

      InputStream in = uc.getInputStream(); 
      int x; 
      while ((x = in.read()) != -1) { 
       System.out.write(x); 
      } 
      in.close(); 

      BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
      StringBuffer buf = new StringBuffer(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       buf.append(line); 
      } 


     } catch(Exception exception) 
     { 
      exception.printStackTrace(); 
     } 


    } 

Web应用程序端:

InputStream in = request.getInputStream(); 
BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
StringBuffer buf = new StringBuffer(); 
String line; 
while ((line = r.readLine())!=null) { 
    buf.append(line); 
} 


Map<String,Object> map=convertJsonToMap(buf.toString()); 

private Map<String, Object> convertJsonToMap(String json) { 

     Map<String, Object> map = new HashMap<String, Object>(); 
     ObjectMapper mapper = new ObjectMapper(); 
     try { 

      // convert JSON string to Map 
      map = mapper.readValue(json,new TypeReference<HashMap<String, Object>>() {}); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return map; 
    } 
1

您只使用toString()方法。从它开始反序列化是不可能的。 使用JSON或Java序列化工具将Map移动到可转移状态(视图)。客户端使用相同的工具来反序列化它。

+0

任何事情都可以反序列化(如果字节数组打印正确),它只需要一个自定义分析器 –

+0

@ cricket_007我不这么认为。只有真正的序列化对象才能被反序列化。任何事物都不能被反序列化。 – ruslanys

+0

一致格式化的字符串可以反序列化;) –

0

在您的案例中使用toString()会生成HashMap的字符串表示并通过网络发送,而不是实际的HashMap,这就是您在Web应用程序端看到该表示的原因。

您应该使用ObjectOutputStream/ObjectInputStream类来发送/接收您的HashMap

ObjectOutputStream/ObjectInputStream特别关注跨网络发送对象。

但是这需要要通过 网络发送(这一过程被称为序列化)的所有对象必须实现Serializable接口,这是一个标记接口。