我需要将Vector转换为字符串(反之亦然)以存储在数据库的CHAR字段中。什么是最有效的方法来做到这一点?将矢量<String>序列化为字符串
1
A
回答
10
让我直截了当地说...你想要以某种格式(比如CSV)将字符串数组存储到数据库中,以便稍后重新组合成数组?这是一个非常糟糕的主意。我知道这一点,因为我必须每天都通过系统工作来承受这一点。维护起来非常糟糕,如果你想查询这些数据,你的代码将变得非常复杂。真的,你应该规范你的数据库,这样你有一个单独的表(这些字符串是一个字符串),并用当前表中的“字符串数组”列替换这个新表的外键。
1
你可以尝试(从commons-lang):字符串
ArrayUtils.toString(vector.toArray());
2
的矢量转换,而要很好的关系数据库模型。 Vector索引与表格ID字段类似,字符串很好地转换为CHAR字段。以这种格式存储数据会更自然。当你稍后需要Vector时,只需重建它,而不是将其存储在单个序列化字段中。
0
放下是否你正在做的是一个好主意,我可能会做一个stringstream和一个for循环写入字符串流。最后,调用str()。不知道为什么它需要比这样的明显解决方案更复杂。
0
任意向量的一般策略是将向量序列化为字节,然后将字节转换为字符串而不丢失任何数据。
以下示例使用ByteArrayInput/OutputStream将字节数组保存在内存中,并通过为每个字符打包两个字节来对结果进行编码。如果数据库透明地将字符串转换为不同的语言环境,则可能需要使用不同的策略将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();
}
}
相关问题
- 1. 字符串矢量程序
- 2. 字符串矢量排序
- 3. 将矢量转换为字符串
- 4. vhdl:将矢量转换为字符串
- 5. 将字符串[]转换为矢量<String>
- 6. 矢量<char>用零字符串
- 7. 将MongoDB ObjectId序列化为字符串
- 8. 将System.Array序列化为XML字符串
- 9. 将XML序列化为字符串
- 10. 将对象序列化为字符串
- 11. 如何将IList <object>序列化为字符串
- 12. 将未知大小的矢量<矢量<string>>转换为字符
- 13. 从字符串到字符串流到矢量<int>
- 14. 优化不必要字符串复制在矢量<string>
- 15. 使用RestSharp将XML CDATA反序列化为字符串变量
- 16. 字符串转换为数字矢量
- 17. 从矢量< char >转换为字符串
- 18. C++复制一个字符串数组[]为矢量<string>
- 19. RDD [X:矢量[字符串]以RDD [X:矢量[字符串] +迭代器:矢量[字符串]
- 20. 将字符串插入到矢量
- 21. 将矢量转换为字符串并拆分为JSP的字符串
- 22. 结合字符串矢量
- 23. 将矢量<unsigned char>转换为矢量<unsigned short>
- 24. 将矢量<derived> :: iterator转换为矢量<base> :: iterator
- 25. 如何将矢量<string>转换为矢量<char*>
- 26. 将任何数据类型序列化为矢量<uint8_t> - 使用reinterpret_cast?
- 27. R:通过一个字符串矢量为字符串
- 28. 如何将带有字符串的矢量转换为数字?
- 29. 使用JSON.NET反序列化和序列化字典<字符串,对象>
- 30. [R字符串转换为记号化使用,以矢量“”