[英]Converting from object to byte array and back in java
我有两个类: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 );
通常如何做?
谢谢Maricruzz
这应该可行,只要从序列化/反序列化函数接收到对象,然后将其转换为您的类即可。
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();
}
我想为您提供序列化课程的手动方法。
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
方法将为您提供所需的东西,并具有以下好处:
如果您需要序列化更复杂的数据结构,我强烈建议您选择一个建立良好的序列化库,例如google协议缓冲区 (我个人选择的武器)或不遭受安全噩梦困扰的众多其他库之一。 Java序列化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.