2011-10-10 143 views
1

我創建了一個用於與另一個Delphi應用程序通信的Android應用程序。 delphi應用程序接受的數據是union。我用UDP發送一個我定義創建我的類的類型。但delphi應用程序收到的數據不正確的解釋。所以我想知道是否存在一個在java中實現聯合類型的方法。 我已經看過這個http://lambda-the-ultimate.org/node/2694,但我不明白他在那個班上做了什麼。Delphi應用程序和使用Union的Android應用程序之間的通信

編輯:對不起,但我只有我的代碼,因爲delphi應用程序是由另一個程序員創建的。不過,我已經解決了這個問題。德爾福申請通緝字節的小端排序,而我給他們大端,所以以這種方式流後,序列化數據:

ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
DataOutputStream dos=new DataOutputStream(baos); 
try{ 
    dos.writeLong(Double.doubleToRawLongBits(x)); 
    dos.flush(); 
    px=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(y)); 
    dos.flush(); 
    py=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(z)); 
    dos.flush(); 
    pz=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(a)); 
    dos.flush(); 
    ga=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(b)); 
    dos.flush(); 
    gb=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(c)); 
    dos.flush(); 
    gc=baos.toByteArray(); 
    baos.reset(); 
}catch(Exception e){} 

的話,我都倒了一些對圈子中,因爲這些順序:

ByteBuffer bb = ByteBuffer.allocate(48); 
//bb.order(ByteOrder.LITTLE_ENDIAN); 
for(int i=7;i>=0;i--) 
    bb.put(messaggio.getPx()[i]); 
for(int i=7;i>=0;i--) 
    bb.put(messaggio.getPy()[i]); 
for(int i=7;i>=0;i--) 
bb.put(messaggio.getPz()[i]); 
for(int i=7;i>=0;i--) 
bb.put(messaggio.getGa()[i]); 
for(int i=7;i>=0;i--) 
bb.put(messaggio.getGb()[i]); 
for(int i=7;i>=0;i--) 
bb.put(messaggio.getGc()[i]); 
byte[] messbyte=bb.array(); 

你看messaggio.getPx等,因爲最初的想法是我的課發送的對象,但我通過Wireshark的看到,序列化對象主角與他的一些信息,如包的名稱。所以我決定發送一個48字節的字節向量(是六個雙字段)。我通過getPx(),getPy(),...方法選擇此字段。 但服務器還有其他問題。但對於這些問題,我會與delphi程序員談談。

+0

你如何序列化你的Java類的數據? – Robert

+0

你能提供一些更多的細節。沒有代碼,沒有數據格式的描述,也沒有描述系統如何失敗。沒有這個問題非常難以解決。 –

+0

它是「聯盟」還是「Unicode」? – mjn

回答

1

Java不支持在同一存儲位置存儲兩種不同類型的值。在Lambda Ultimate論壇上給出的Either類不是C和Pascal具有聯合類型的聯合方式。 C和Pascal允許您在一個字段中存儲值並從另一個字段中讀取,並且您將得到一個隱式類型轉換。在論壇上顯示的Java類可以讓您創建一個包含任一類型值的聯合值,但是一旦創建了值,您只能讀取存儲的值;你不能從其他類型讀取。

要在運行時從套接字上的數據創建這樣一個值,您需要知道該字段的類型。當您讀取套接字的值時,請確定其類型,並創建適當類型的Either子類(Either.LeftEither.Right)。在序列化Java數據時,請撥打leftright以獲取當前值。

相關問題