2011-10-10 113 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以获取当前值。

相关问题