有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据字节数组的有效长度对其进行非序列化

我有一个长度等于XXX的字节数组。它包含一个我想取消序列化的序列化对象(即:我想从这些存储的字节创建此对象的副本)

但我有一个限制:字节数组的有效长度。事实上,我想考虑后者来取消序列化(即:序列化对象可以比数组的大小短)

我希望您能更容易地理解我的两个小方法(第一个系列,而最后一个非系列):

byte[] toBytes() throws IOException {
    byte[] array_bytes;

    ByteArrayOutputStream byte_array_output_stream = new ByteArrayOutputStream();
    ObjectOutput object_output = new ObjectOutputStream(byte_array_output_stream);
    object_output.writeObject(this);
    object_output.close();
    array_bytes = byte_array_output_stream.toByteArray();

    return array_bytes;
}

以及当前的非序列化方法(因为我没有使用有用的长度,所以目前这种方法是“错误的”):

static Message fromBytes(byte[] bytes, int length) throws IOException, ClassNotFoundException, ClassCastException {
    Message message;

    ByteArrayInputStream byte_array_input_stream = new ByteArrayInputStream(bytes);
    ObjectInput object_input = new ObjectInputStream(byte_array_input_stream);
    message = (Message) object_input.readObject();
    object_input.close();

    return message;
}

正如您所看到的,readObject不需要长度,我必须:这是一个问题,也许我不应该使用此方法

因此,我的问题是:使用或不使用readObject,我如何考虑有用的长度(即:“有效负载”?)我的字节数组


共 (1) 个答案

  1. # 1 楼答案

    我假设您的Message类实现了Serializable。 在本例中,当write处理消息时,它会从java运行时自动序列化,如Serializable接口中所述

    我无法确定您如何或为什么会发现生成的字节数组的一部分没有用处,因为它都是序列化实例的一部分

    但是,我可能建议您遵循Externalizable接口方式: 您的Message类将实现Externalizable。然后,您可以选择分别在writeExternal(ObjectOutput out)readExternal(ObjectInput in)方法中控制类的序列化和反序列化方式,在这些方法中,您可以在流中写入所需的长度,读回该长度,和/或仅保留所需的字节数