LONGTEXT或BLOB用于序列化的base64编码的java对象

时间:2014-02-11 20:20:25

标签: java mysql serialization encoding

我正在尝试有效地序列化和存储数据库中的对象/数据。该对象可以采用任何形式,但在大多数情况下,它将是一个具有原始对应部分的类(例如Integer)。我已经编写了以下方法来编组和解组:

private String marshall(Object obj) throws IOException {
    if (obj instanceof String) {
        return (String) obj;
    } else if ((obj instanceof Integer) || (obj instanceof Byte) || (obj instanceof Short) || (obj instanceof Long) || (obj instanceof Float) || (obj instanceof Double) || (obj instanceof Boolean) || (obj instanceof Character)) {
        return obj.toString();
    } else {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
            oos.writeObject(obj);
        }
        return new String(Base64Coder.encode(baos.toByteArray()));
    }
}

private Object unmarshall(String str, Class type) throws IOException, ClassNotFoundException {
    if (type.equals(Integer.class)) {
        return Integer.parseInt(str);
    } else if (type.equals(String.class)) {
        return str;
    } else if (type.equals(Byte.class)) {
        return Byte.parseByte(str);
    } else if (type.equals(Short.class)) {
        return Short.parseShort(str);
    } else if (type.equals(Long.class)) {
        return Long.parseLong(str);
    } else if (type.equals(Float.class)) {
        return Float.parseFloat(str);
    } else if (type.equals(Double.class)) {
        return Double.parseDouble(str);
    } else if (type.equals(Boolean.class)) {
        return Boolean.parseBoolean(str);
    } else if (type.equals(Character.class)) {
        return str.toCharArray()[0];
    } else {
        byte[] data = Base64Coder.decode(str);
        Object o;
        try (ObjectInputStream ois = new ObjectInputStream(
                new ByteArrayInputStream(data))) {
            o = ois.readObject();
        }
        return o;
    }
}

这些方法工作正常(或者至少我的JUnit测试似乎认为他们这样做)但我只是想知道存储输出值的最佳方法是什么。我看到的两个选项是LONGTEXT或BLOB。我可以看到两者都有一些优势。根据我的研究,两者的最大长度为4GB-1B。 BLOBS是不可搜索的,但是存储逐字节传递给它们的数据(这可能是也可能不是有利的 - 我不确定)。 LONGTEXT是可搜索的,如果我可以将编码从UTF-8更改为更接近BASE64(如果您知道哪种编码最好,请告诉我),那么它可能比BLOB编码(目前是编码为UTF-8并通过CONVERT(value USING utf8)可逆。

我看到的另一个选项是存储rawValue,只使用.toString方法存储任何内容,value存储BLOB甚至LONGTEXT(如果适用)。这将在rawValue中提供可搜索的数据,在value中提供对象表示。我不确定从长远来看这是否有利于做,但它会使第三方更容易访问数据库并从其他语言(如PHP)读取数据。

如果您觉得自己有更好的方法,我愿意接受完全不同方法的建议。

1 个答案:

答案 0 :(得分:1)

最节省空间的方法是BLOB,没有你提到的转换。序列化数据是二进制的,我没有看到很多能够搜索它的数据。 Base64等没有更大的空间效率。