我有一个代码,我将数组列表转换为字节数组,然后将该字节数组保存为MySQL数据库中的BLOB。以下是代码: -
Object temp = attributes.get(columnName);
if (temp instanceof List && temp != null) {
List extraAttributes = (ArrayList) temp;
resultStmt.setBytes(currentIndex, createByteArray(extraAttributes));
方法createByteArray
的定义如下:
private byte [] createByteArray( Object obj)
{
byte [] bArray = null;
try
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream objOstream = new ObjectOutputStream(baos);
objOstream.writeObject(obj);
bArray = baos.toByteArray();
}
catch (Exception e)
{
TraceDbLog.writeError("Problem in createByteArray", e);
}
return bArray;
}
以上代码是为了将HashMap写入BLOB而编写的,我使用相同的方法将HashMap转换为BLOB。
我正在读取blob时读取代码中出现的问题。
private Object readBytes (ResultSet rs, String columnName)
throws SQLException
{
ObjectInputStream ois = null;
byte [] newArray;
Object obj = null;
try
{
newArray = rs.getBytes(columnName);
ois = new ObjectInputStream (new ByteArrayInputStream(newArray));
obj = ois.readObject ();
}
在读取部分中,对象不是来自hasMap的arrayList,而在eclipse中的调试透视中,eclipse也无法检查即将到来的对象。
我还尝试将对象强制转换为List,但仍无法获得正确的响应。 请告诉我读/写上述BLOB是否有任何缺陷。
答案 0 :(得分:4)
我已经将用于转换ArrayList的样本编码添加到byte []。 一种合理的方法是使用像DataOutputStream这样的UTF-8编码为列表中的每个字符串。对于字符串,它为UTF-8编码的长度写入2个字节,后跟UTF-8字节。如果您不在另一端使用Java,这将是可移植的。以下是编码和解码ArrayList的示例:
// example input list
List<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");
// write to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
for (String element : list) {
out.writeUTF(element);
}
byte[] bytes = baos.toByteArray();
// read from byte array
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DataInputStream in = new DataInputStream(bais);
while (in.available() > 0) {
String element = in.readUTF();
System.out.println(element);
}
答案 1 :(得分:0)
最简单的方法是将其转换为json字符串,然后转换为字节
Gson gson = new Gson();
Type type = new TypeToken<List<Alarm>>() {}.getType();
String json = gson.toJson(list, type);
byte[] bytes = json.getBytes();