我创建了一个用于与另一个Delphi应用程序通信的android应用程序。 delphi应用程序接受的数据是union。我发送UDP给它一个我定义创建我的类的类型。但是delphi应用程序接收的数据被错误地解释了。所以我想知道是否存在一种在java中实现union类型的方法。 我已经看过这个http://lambda-the-ultimate.org/node/2694,但我不明白他对这个课程做了什么。
编辑:抱歉,但我只有我的代码,因为delphi应用程序是由另一个程序员创建的。但是我已经解决了这个问题。 delphi应用程序需要用小端序排序的字节,而我用big endian发送它们,所以用这种方式用流序列化数据之后: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 :(得分:1)
Java不支持在同一存储位置存储两种不同类型的值。在Lambda the Ultimate论坛上给出的Either
类不是C和Pascal具有联合类型的联盟。 C和Pascal允许您将值存储在一个字段中并从另一个字段读取,并获得隐式类型转换。论坛中显示的Java类允许您为包含任一类型值的联合创建一个值,但是一旦创建了Either
值,您就只能读取您存储的值;你不能从另一种类型中读取。
要在运行时从套接字上的数据创建此类值,您需要知道该字段的类型。在读取套接字的值时,确定它的类型并创建正确类型的Either
子类(Either.Left
或Either.Right
)。序列化Java数据时,请调用left
或right
以获取当前值。