2

我正在尝试编写一个函数,该函数使用 UTF-8 编码将 Java 对象序列化为字符串。这是我的实现:

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;
    }
}

但是,它似乎不起作用。我试图将生成的字符串传递到只接受 UTF-8 编码但因编码问题错误而失败的数据库中。

我的问题是:

  1. 我的实施有什么问题?
  2. 如何检查结果字符串是否为 UTF-8?

非常感谢

问候

4

3 回答 3

3

这不是一个好主意,任意二进制数组并不总是转换为有效的 UTF-8 序列。您应该将数组作为二进制 blob 放入数据库中,或者将数组转换为具有类似 Base64 编码的字符串。

于 2012-05-23T20:49:22.370 回答
1

我正在尝试编写一个函数,该函数使用 UTF-8 编码将 Java 对象序列化为字符串。

是的......好吧,您的代码实际上正在做的是将对象序列化为字节,然后告诉String构造函数“这些字节是某些 Unicode 代码点的有效 UTF-8 编码”。问题是(一般来说)它们不是……当 UTF-8 解码器尝试将它们转换为 Java 字符串中使用的 UTF-16 表示时,它会发现无效的序列并将它们替换为“无效字符”代码点。

如果要将任意字节表示为 Java 字符串,则需要使用 base64 编码之类的东西。一个更好的主意是将字节作为 Blob 放入数据库中。

于 2012-05-24T02:26:33.683 回答
1

你一定会在你的字符串中得到不可打印的字符,而数据库根本不喜欢这些字符。Java ByteArrayOutputStream 文档暗示它可能会将不可打印的字符重新编码为可打印的,但是,查看代码,我看不出它除了停止程序并出现错误之外什么都做。我也看不到你将来会用这样的字符串做什么。

一个字节的 256 个可能值中只有一部分(大约四分之一)是有效的 ASCII 字符。大多数数据库不会将它们作为字符串的一部分。因此你的错误信息。(Unicode 和 UTF-8 有同样的问题。)

我曾经通过将每 6 位转换为包含可打印字符的字节将二进制数据转换为可打印字符,从而将二进制数据存储在数据库中。但是我使用了简单的 ASCII 编码,并编写了代码将字符转换二进制。然后我能够将二进制数据存储在数据库字符列中并稍后检索它。我是被迫的。我不建议你这样做。

如果您想查看“字符串”的外观,只需将每个字节打印为整数并将其与 ASCII 表进行比较。您可能会看到问题,而无需考虑 Unicode 的优点。

于 2012-05-23T20:57:47.170 回答