【问题标题】:Convert byte[] to List<Map<String, Object>>将 byte[] 转换为 List<Map<String, Object>>
【发布时间】:2018-08-15 18:36:32
【问题描述】:

我可以将List&lt;Map&lt;String,Object&gt;&gt; 转换为byte[]
但是当我将byte[] 转换回List&lt;Map&lt;String,Object&gt;&gt; 时,它只给出第一个对象(键,值对)

如何遍历字节数组或 ObjectOutputStream?

但是,我尝试了 while (ObjectOutputStream#available() &gt; 0 )ois.available() 返回 0

public class MyClass {
    public static void main(String args[]) {
        List<Map<String, Object>> list = new ArrayList<>();
        Map<String, Object> map = new HashMap<>();
        map.put("age", 12);
        map.put("name","gh");
        list.add(map);

        Map<String, Object> map1 = new HashMap<>();
        map1.put("age", 20);
        map1.put("name","ty");
        list.add(map1);
        System.out.println(convertToObject(convertToByteArray(list)));
    }

    private static byte[] convertToByteArray(List<Map<String, Object>> resultSet) {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        try {
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            for (Map<String, Object> map : resultSet) {
                out.writeObject(map);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return byteOut.toByteArray();
    }
    private static Object convertToObject(byte[] byteArr){
        Object obj = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;
        try {
            bis = new ByteArrayInputStream(byteArr);
            ois = new ObjectInputStream(bis);
            obj = ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
       } 
       return  obj;
    }
}

【问题讨论】:

    标签: arrays object type-conversion


    【解决方案1】:

    我正在迭代ObjectInputStream,并希望获得整个地图对象列表。 当我遍历ByteArrayInputStream 时,我将整个byte[] 转换为List&lt;Map&lt;String,Object&gt;&gt;

    这里是完整的方法:

    private static List<Map<String, Object>> convertToObject(byte[] byteArr){
        List<Map<String, Object>> list = new ArrayList<>();
        Object obj = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;
        try {
            bis = new ByteArrayInputStream(byteArr);
            ois = new ObjectInputStream(bis);
            //this is the chage I did 
            while(bis.available() > 0){
                list.add((Map<String, Object>)ois.readObject());
            }
            //change complete
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } 
        return  list;
    }
    

    【讨论】:

      【解决方案2】:

      根据documentation

      任何超出相应 writeObject 方法写入的自定义数据边界的对象数据的读取尝试都将导致抛出 OptionalDataException 且 eof 字段值为 true。

      所以你想try { while(true) { 并在你catch (OptionalDataException e) 时返回成功。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多