2010-04-23 87 views

回答

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(); 
    } 
}