【问题标题】:Converting from object to byte array and back in java在java中从对象转换为字节数组并返回
【发布时间】:2014-04-29 11:47:18
【问题描述】:

我有两个类:TcpPacket 和 IpPacket。 tcpPacket 应该存储在 ip 数据包的数据字段中。如何可靠地将 tcpPacket 对象转换为字节数组,以便将其存储在 IpPacket 的数据字段中?而在对方接收到数据包后,如何可靠地将其转换回数据包对象?

public static final class TcpPacket {
    int source;
    int destination;

    public Packet( int source, int destination ) {
        this.source = source;
        this.destination = destination;
    }

    public String toString() {
        return "Source: " + source + ", Dest: " + destination;
    }
}

public static final class IpPacket {
    byte[] data;

    IpPacket( byte[] data ){
        this.data = data;
    }
}

TcpPacket tcpPacket = new TcpPacket( <someint>, <someint> );

// the following doesn't work because tcppacket is not a byte array.
IpPacket ipPacket = new IpPacket( tcpPacket );

这通常是怎么做的?

谢谢玛丽克鲁兹

【问题讨论】:

标签: java serialization bytearray


【解决方案1】:

这应该可以,只需在从序列化/反序列化函数接收对象后将其转换为您的类。

public static byte[] objToByte(TcpPacket tcpPacket) throws IOException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    ObjectOutputStream objStream = new ObjectOutputStream(byteStream);
    objStream.writeObject(tcpPacket);

    return byteStream.toByteArray();
}

public static Object byteToObj(byte[] bytes) throws IOException, ClassNotFoundException {
    ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
    ObjectInputStream objStream = new ObjectInputStream(byteStream);

    return objStream.readObject();
}

【讨论】:

    【解决方案2】:

    我想为您提供手动序列化您的课程的方法。

    public static final class TcpPacket {
    
        public byte [] toByteArray() {
            ByteBuffer b = ByteBuffer.allocate(4 * 2);
            return b.putInt(source).putInt(destination).array();
        }
    
        public static TcpPacket fromByteArray(byte [] bytes) {
            if (bytes.length < 8) throw new IllegalArgumentException("not enough bytes");
    
            ByteBuffer b = ByteBuffer.wrap(bytes);
            int source = b.getInt();
            int destination = b.getInt();
            return new TcpPacket(source, destination);
        }
    }
    

    添加toByteArray 和静态fromByteArray 方法可以满足您的需求,并具有以下好处:

    • 非常小的表示形式,只有 8 个字节,理论上可以通过整数的可变长度编码更小
    • 不会将您的应用程序暴露给 Java 序列化安全问题,因为显然您将从网络连接中反序列化数据。

    如果您需要序列化更复杂的数据结构,我强烈建议您选择完善的序列化库,例如 google protocol buffers(我个人选择的武器)或其他许多不受安全性影响的库之一Java 序列化的噩梦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2014-10-26
      • 2016-06-22
      • 2013-01-09
      • 1970-01-01
      • 2011-08-15
      相关资源
      最近更新 更多