【问题标题】:how to store many objects in a byte array如何将许多对象存储在一个字节数组中
【发布时间】:2018-09-11 23:47:34
【问题描述】:

我正在用 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.....
}

【问题讨论】:

  • 什么样的对象?请注意,并非 Java 中的所有内容都可以以有意义的方式序列化为字节。
  • 您能否发布一些代码向我们展示您尝试过的内容以及您想要实现的目标?

标签: java arrays serialization


【解决方案1】:

因此,如果没有更多详细信息,您通常可以通过序列化发送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);

【讨论】:

  • 问题中的字节数组在哪里?
  • 这里我不明白如何发送和接收数据
  • 查看更新的回复,起初我误解了这个问题。
  • 如果从 native 方法返回的数据源返回字节,那么是的,您可以将字节传递给 this 并读取对象。但是,这不包括完全不同的 c 部分。看到这个:medium.com/@bschlining/…
  • 但是在发送到java之前如何在cpp中写入这样的数据?
【解决方案2】:

最后我做的是这个—— 我将要发送的每个对象都转换为基数 32,然后在每个转换后的对象之间添加一个“,”来分隔对象(因为基数 32 表示不需要“,”)。 之后分析就很简单了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多