我正在尝试编写一个函数,它使用UTF-8编码将Java对象序列化为String。这是我的实施:
public static String serializeToString(DefaultMutableTreeNode tree) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
ObjectOutput out = new ObjectOutputStream(byteArrayOutputStream);
out.writeObject(tree);
return byteArrayOutputStream.toString("UTF-8");
} catch (IOException e) {
return null;
}
}
然而,它似乎不起作用。我试图将生成的String传递给一个只接受UTF-8编码的数据库,但是因编码问题而出现错误。
我的问题是:
非常感谢
此致
答案 0 :(得分:2)
这不是一个好主意,任意二进制数组并不总是转换为有效的UTF-8序列。您应该将数组作为二进制blob放入数据库中,或者将数组转换为类似Base64编码的字符串。
答案 1 :(得分:1)
您必须在字符串中获得不可打印的字符,而DB根本不会喜欢这些字符。 Java ByteArrayOutputStream文档排序提示它可能将不可打印的字符重新编码为可打印,但是,看看代码,我看不出它做了什么,只是因为错误而停止程序。我也不知道将来你会用这种字符串做什么。
只有一个字节的256个可能值的一部分(约四分之一)是有效的ASCII字符。大多数数据库不会将它们作为字符串的一部分。因此您的错误消息。 (Unicode和UTF-8有同样的问题。)
我曾经通过将每6位转换为包含可打印字符的字节将二进制数据转换为可打印字符,从而将二进制数据存储在数据库中。但我使用简单的ASCII编码,我编写代码将 back 转换为二进制。然后,我能够将二进制数据存储在数据库字符列中,并在以后检索它。我被迫进入它;我不建议你这样做。
如果要查看“字符串”的外观,只需将每个字节打印为整数,然后将其与ASCII表进行比较。您可能会在不考虑Unicode的优点的情况下看到问题。
答案 2 :(得分:1)
我正在尝试编写一个函数,使用UTF-8编码将Java对象序列化为String。
是的......你的代码实际做的是将对象序列化为字节,然后告诉String
构造函数“这些字节是一些有效的UTF-8编码Unicode代码点“。问题是(一般来说)它们不是......当UTF-8解码器试图将它们转换为Java String中使用的UTF-16表示时,它会找到无效的序列并用“无效”替换它们。字符“codepoint。
如果要将任意字节表示为Java String,则需要使用类似base64编码的方法。更好的想法是将字节作为Blob放入数据库中。