【发布时间】:2011-10-10 10:57:06
【问题描述】:
我创建了一个与另一个 Delphi 应用程序通信的 android 应用程序。 delphi应用接受的数据是union。我使用 UDP 向它发送我定义的创建类的类型。但是 delphi 应用程序接收到的数据被错误地解释了。所以我想知道是否存在在java中实现联合类型的方法。 我已经看过这个http://lambda-the-ultimate.org/node/2694,但我不明白他对那个班级做了什么。
编辑:抱歉,我只有我的代码,因为 delphi 应用程序是由另一个程序员创建的。不过我已经解决了这个问题。 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){}
然后我用一些 cicles 颠倒了顺序:
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 字节的字节向量(是 6 个双字段)。我通过 getPx(),getPy(),...., 方法选择了这个字段。 但是服务器中还有其他问题。但是对于这些问题我会和delphi程序员谈谈。
【问题讨论】:
-
如何序列化 Java 类中的数据?
-
您能否提供更多详细信息。没有代码,没有数据格式的描述,也没有关于系统如何失败的描述。没有这个问题就很难解决。
-
是“Union”还是“Unicode”?
-
@mjn 肯定是
union,即帕斯卡术语的变体记录。