我正在尝试有效地序列化和存储数据库中的对象/数据。该对象可以采用任何形式,但在大多数情况下,它将是一个具有原始对应部分的类(例如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)读取数据。
如果您觉得自己有更好的方法,我愿意接受完全不同方法的建议。
答案 0 :(得分:1)
最节省空间的方法是BLOB,没有你提到的转换。序列化数据是二进制的,我没有看到很多能够搜索它的数据。 Base64等没有更大的空间效率。