gpt4 book ai didi

java - 用于序列化 Base64 编码的 Java 对象的 LONGTEXT 或 BLOB

转载 作者:行者123 更新时间:2023-11-29 13:14:05 56 4
gpt4 key购买 nike

我正在尝试有效地序列化对象/数据并将其存储在数据库中。该对象可以采用任何形式,但在大多数情况下,它将属于具有原始对应部分(例如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 来存储两者,该 rawValue 只对所存储的内容使用 .toString 方法,并且使用 value 来存储两者。是 BLOB 甚至是 LONGTEXT(如果适用)。这将在 rawValue 中提供可搜索数据,并在 value 中提供对象表示。我不确定这从长远来看是否有益,但它会让第三方更容易访问数据库并从其他语言(例如 PHP)读取数据。

如果您觉得自己有更好的方案适合这种情况,我愿意接受完全不同方法的建议。

最佳答案

最节省空间的方法是 BLOB,没有您提到的转换。序列化数据是二进制的,我认为搜索它没有多大值(value)。 Base64 等并不更节省空间。

关于java - 用于序列化 Base64 编码的 Java 对象的 LONGTEXT 或 BLOB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21712194/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com