将ArrayList转换为字节数组

9

我有一段代码,其中我将数组列表转换为字节数组,然后将该字节数组保存为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 的 ArrayList 转换为 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 ();
        }

在读取部分,对象并不是作为HashMap数组的ArrayList出现,并且在Eclipse的调试视图中也无法检查到该对象。
我已经尝试将对象强制转换为List,但仍然无法获得正确的响应。 请告诉我在读写上述BLOB时是否存在任何缺陷。

读取对象后您得到的是什么对象?如果您执行System.out.println(obj.getClass().getName()),它会打印什么? - Dev Blanked
它显示com.sun.jdi.InvocationtargetException,这意味着Eclipse无法解析。虽然这个异常出现在调试视图中,但是当代码进入catch块时,程序执行是正常的,没有任何问题。 - Timothy Drisdelle
当您执行代码时,is obj = ois.readObject(); 失败了吗?如果没有失败,它返回什么类型的对象? - Dev Blanked
在日志中,我打印了 obj.getClass().getName(),它返回的是 java.util.ArrayList。 - Timothy Drisdelle
如果哈希映射内的对象也被序列化了,当您使用ObjectOutputStream时,这两个对象将被转换为byte[]。 - Dev Blanked
显示剩余4条评论
2个回答

5
我已经添加了转换 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);
}

如果需要使用xml unmarshaller解析内置字节,则需要匹配编码方案。在我的情况下,它不是UTF-8,所以我只需使用out.writeBytes而不是out.writeUTF。否则,marshaller会抛出异常,指出前言中出现了意外内容。仅供参考。 - Raj

1
最简单的方法是将其转换为JSON字符串,然后再转换为字节。
Gson gson = new Gson();
Type type = new TypeToken<List<Alarm>>() {}.getType();
String json = gson.toJson(list, type);
byte[] bytes = json.getBytes();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接