通过 http 请求以字节形式发送 java 个对象:是否需要 BASE64?
Sending java objects as bytes over a http request: is BASE64 necessary?
我有一个可序列化的 Java 对象。我需要让另一个 Java webapp 对这个对象做一些事情。我目前正在使用此设置来传输对象:
- 使用 ByteArrayOutputStream
baos
- 将 baos 放入 ObjectOutputStream
oos
- 使用
oos
写对象,从baos
得到byte[]
- 使用 Base64 编码器将 byte[] 编码为另一个 byte[]
- 使用
httpurlconnection
(POST 方法)发送字节
- 在接收端,我向后执行步骤 1 到 4 以取回我的对象。
这有效!但是,我不确定第 4 步,BASE64 编码在这里真正做了什么。我不能只在请求正文中发送纯字节吗?使用 Base64 encoding/decoding 有哪些优点/安全措施?
这是我在 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());
}
}
Base64 的目的是将字节数组转换为人类可读(且普遍兼容)的格式。
因为底层流通过字节发送数据,并且不存在丢失数据的风险(例如打印控制台控制字符不是 copy/pasteable),因此将字节转换为 Base64 没有意义。如果您将网络协议更改为无法传输 non-printable 个字符的其他协议,除了未来可能的兼容性外,您没有任何好处。
我有一个可序列化的 Java 对象。我需要让另一个 Java webapp 对这个对象做一些事情。我目前正在使用此设置来传输对象:
- 使用 ByteArrayOutputStream
baos
- 将 baos 放入 ObjectOutputStream
oos
- 使用
oos
写对象,从baos
得到 - 使用 Base64 编码器将 byte[] 编码为另一个 byte[]
- 使用
httpurlconnection
(POST 方法)发送字节 - 在接收端,我向后执行步骤 1 到 4 以取回我的对象。
byte[]
这有效!但是,我不确定第 4 步,BASE64 编码在这里真正做了什么。我不能只在请求正文中发送纯字节吗?使用 Base64 encoding/decoding 有哪些优点/安全措施?
这是我在 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());
}
}
Base64 的目的是将字节数组转换为人类可读(且普遍兼容)的格式。
因为底层流通过字节发送数据,并且不存在丢失数据的风险(例如打印控制台控制字符不是 copy/pasteable),因此将字节转换为 Base64 没有意义。如果您将网络协议更改为无法传输 non-printable 个字符的其他协议,除了未来可能的兼容性外,您没有任何好处。