簡體   English   中英

從對象轉換為字節數組然后在Java中轉換

[英]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方法將為您提供所需的東西,並具有以下好處:

  • 理論上,非常小的表示(只有8個字節)可以通過整數的可變長度編碼而變小
  • 不會使您的應用程序面臨Java序列化安全性問題,因為顯然您將要反序列化網絡連接中的數據。

如果您需要序列化更復雜的數據結構,我強烈建議您選擇一個建立良好的序列化庫,例如google協議緩沖區 (我個人選擇的武器)或不遭受安全噩夢困擾的眾多其他庫之一。 Java序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM