通过http请求将java对象作为字节发送:是否需要BASE64?

时间:2016-01-08 21:38:44

标签: java http base64

我有一个可序列化的Java对象。我需要让另一个Java webapp对这个对象做点什么。我目前正在使用此设置来传输对象:

  1. 使用ByteArrayOutputStream baos
  2. 将baos放入ObjectOutputStream oos
  3. 使用oos撰写对象,并从byte[]
  4. 获取baos
  5. 使用Base64编码器将byte []编码为另一个字节[]
  6. 使用httpurlconnection(POST方法)发送字节
  7. 在接收端,我向后执行步骤1到4以恢复我的对象。
  8. 这个有效!但是,我不确定第4步,BASE64编码在这里做了什么。我不能只在请求的正文中发送普通字节吗?使用Base64编码/解码可以获得哪些优势/安全措施?

    以下是我在other question中找到的步骤1-4中描述的相关代码段。

     /** Read the object from Base64 string. */
       private static Object fromString( String s ) throws IOException, ClassNotFoundException {
            byte [] data = Base64.getDecoder().decode( s );
            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(  data ) );
            Object o  = ois.readObject();
            ois.close();
            return o;
       }
    
        /** Write the object to a Base64 string. */
        private static String toString( Serializable o ) throws IOException {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream( baos );
            oos.writeObject( o );
            oos.close();
            return Base64.getEncoder().encodeToString(baos.toByteArray()); 
        }
    }
    

1 个答案:

答案 0 :(得分:1)

Base64的目的是将字节数组转换为人类可读(和通用兼容)格式。

因为底层流通过字节发送数据,并且没有丢失数据的风险(例如打印到控制台,控制字符不能复制/粘贴),所以将字节转换为Base64没有意义。如果您将网络协议更改为无法传输不可打印字符的其他内容,则除了可能的未来兼容性之外,您将获得任何好处。