我需要将Vector转换为String(反之亦然),以存储在数据库的CHAR字段中。最有效的方法是什么?
答案 0 :(得分:10)
让我直截了当地说...您想要将一些格式的字符串(例如,CSV)存储到单个列中的DB中,以便以后可以将它们重构为数组?这是一个非常糟糕的主意。我知道这一点,因为我每天都要通过在系统上工作而受到影响。维护起来很糟糕,如果你想查询这些数据,你的代码将变得非常复杂。实际上,您应该对数据库进行规范化,以便为这些字符串设置单独的表(每行为一个字符串),并使用此新表的外键替换当前表中的“字符串数组”列。
答案 1 :(得分:2)
Strings的Vector很好地转换为关系数据库模型。 Vector索引类似于表id字段,String很好地转换为CHAR字段。以这种格式存储数据会更自然。当您稍后需要Vector时,只需重新构建它,而不是将其存储在单个序列化字段中。
答案 2 :(得分:1)
您可以尝试(来自commons-lang):
ArrayUtils.toString(vector.toArray());
答案 3 :(得分:0)
答案 4 :(得分:0)
任意向量的一般策略是将向量序列化为字节,然后将字节转换为字符串而不丢失任何数据。
以下示例使用ByteArrayInput / OutputStream将字节数组保存在内存中,并通过为每个char打包两个字节来对结果进行编码。如果数据库透明地将字符串转换为其他语言环境,则可能需要使用不同的策略将byte []转换为String(例如,base64)。或者,考虑将数据库列更改为BLOB。这样做也可以避免将序列化数据保存在内存中,如果Vector很大,这可能很重要。
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Vector;
public class a {
public static void main(String[] args) throws Exception {
Vector<Object> v = new Vector<Object>();
v.add("hello");
v.add(1);
v.add(true);
v.add(v);
System.out.println(deserialize(serialize(v)));
}
private static String serialize(Object o) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(o);
oos.close();
byte[] bytes = baos.toByteArray();
char[] chars = new char[(bytes.length + 1) / 2];
for (int ci = 0, bi = 0; ci < chars.length; ci++) {
chars[ci] = (char)(bytes[bi++] << 8);
if (bi < bytes.length) {
chars[ci] |= (char)(bytes[bi++] & 0xff);
}
}
return new String(chars);
}
private static Object deserialize(String s)
throws IOException, ClassNotFoundException {
byte[] bytes = new byte[s.length() * 2];
for (int ci = 0, bi = 0; ci < s.length(); ci++) {
bytes[bi++] = (byte)(s.charAt(i) >> 8);
bytes[bi++] = (byte)s.charAt(i);
}
return new ObjectInputStream(new ByteArrayInputStream(bytes)).readObject();
}
}