如何在字节数组中存储许多对象

时间:2018-04-02 18:30:37

标签: java arrays serialization

我在java编码,我遇到了问题 我正在使用一个接口(老师给了我们,我们无法改变它),界面强制你实现一个输入字节数组的函数,通过这个数组,你可以传输你想要的任何数据。

我需要传递一些未知大小的不同对象,有没有办法做到这一点?我显然可以把每个对象的大小放在一开始,但这有什么比这更简单的方法了吗?

我还需要从另一种语言(如c或cpp)传递字节数组中的数据 所以该技术必须非特定于java

这是代码看起来像

的简单示例
void myFunc(byte[] arr)
{
    byte[] name; // arr[0:10] string in ascii
    byte[] lastName; //arr[10:k] string in ascii
    byte[] currentUnixTime; //arr[k:arr.lenfth] this is an int

    some operations.....
}

2 个答案:

答案 0 :(得分:0)

因此,如果没有进一步的细节,您可以通过序列化一般发送Object,但它可能并不总是一个好主意。这是Object序列化的一个相当通用的实现。

interface Sender {
    void write(OutputStream outputStream, Object... objects);

    List<Object> read(InputStream inputStream);
}

class Homework implements Sender {
    @Override
    public void write(OutputStream stream, Object... objects) {
        for (Object obj : objects) {
            try (ObjectOutputStream objStream = new ObjectOutputStream(stream)) {
                objStream.writeObject(obj);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public List<Object> read(InputStream stream) {
        List<Object> objectList = new ArrayList<>();
        try (ObjectInputStream objStream = new ObjectInputStream(stream)) {

            Object obj;
            while ((obj = objStream.readObject()) != null) {
                objectList.add(obj);
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return objectList;
    }
}
编辑:我误解了这个问题。以下是使用byte[] s

的实现
interface Sender {
    byte[] write(Object... objects);

    List<Object> read(byte[] bytes);
}

class Homework implements Sender {
    @Override
    public byte[] write(Object... objects) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try (ObjectOutputStream objStream = new ObjectOutputStream(out)) {
            for (Object obj : objects) {
                objStream.writeObject(obj);
            }
            objStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return out.toByteArray();
    }

    @Override
    public List<Object> read(byte[] bytes) {
        List<Object> objectList = new ArrayList<>();
        ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes);
        try (ObjectInputStream objStream = new ObjectInputStream(byteInputStream)) {

            Object obj;
            while ((obj = objStream.readObject()) != null) {
                objectList.add(obj);
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return objectList;
    }
}

然后使用它。

Homework homework = new Homework();
String helloWorld = "hello world";
byte[] helloBytes = homework.write(helloWorld);
assert homework.read(helloBytes).get(0).equals(helloWorld);

答案 1 :(得分:0)

最后我做了什么 - 我将每个要发送的对象转换为32,然后在每个转换对象之间添加一个','来分隔对象(因为','不需要基本32表示)。 之后分析很简单