【问题标题】:Sending java objects as bytes over a http request: is BASE64 necessary?通过 http 请求将 java 对象作为字节发送:BASE64 是否必要?
【发布时间】:2016-01-08 21:38:44
【问题描述】:

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

  1. 使用 ByteArrayOutputStream baos
  2. 将包放入 ObjectOutputStream oos
  3. 使用oos写入对象,并从baos获取byte[]
  4. 使用 Base64 编码器将 byte[] 编码为另一个 byte[]
  5. 使用httpurlconnection(POST 方法)发送字节
  6. 在接收端,我向后执行步骤 1 到 4 以取回我的对象​​。

这行得通!但是,我不确定第 4 步,BASE64 编码在这里真正做了什么。我不能只在请求的正文中发送纯字节吗?使用 Base64 编码/解码有哪些优势/安全措施?

这是我在这个other question中找到的步骤1-4中描述的相关代码sn-p。

 /** 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()); 
    }
}

【问题讨论】:

  • 你可以发送二进制,base64不是必须的

标签: java http base64


【解决方案1】:

Base64 的目的是将字节数组转换为人类可读(且普遍兼容)的格式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2023-03-31
    • 2018-05-04
    • 2013-01-15
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多