Я создал приложение Android для связи с другим приложением Delphi. Данные, которые принимает приложение delphi, являются union. Я отправляю с UDP ему тип, который я определил, создавая свой класс. Но данные, полученные приложением delphi, неправильно интерпретируются. Поэтому я хочу знать, существует ли метод для реализации типа объединения в java. Я уже смотрю этот http://lambda-the-ultimate.org/node/2694, но я не понимаю, что он делает с этим классом.
EDIT: Извините, но у меня есть только мой код, потому что приложение 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 и т.д., Потому что первоначальная идея заключалась в отправке объекта моего класса, но я вижу через wirehark, что объект serialize ведет с ним некоторую информацию, такую как имя пакета. Поэтому я решил отправить байтовый вектор из 48 байтов (было шесть двойных полей). Я выбираю это поле через метод getPx(), getPy(),..... Но есть и другие проблемы на сервере. Но для этих проблем я поговорю с программистом delphi.
Java не поддерживает сохранение значений двух разных типов в одном хранилище. Either
класс, данный на форуме Lambda Ultimate, не является объединением в том, что C и Pascal имеют типы объединения. C и Pascal позволяют хранить значение в одном поле и читать из другого поля, и вы получаете неявный тип. Класс Java показан на форуме позволяет создавать ценности для объединения, который содержит значение любого типа, но как только вы создали Either
значение, вы можете читать только значение, которое хранится; вы не можете читать из другого типа.
Чтобы создать такое значение во время выполнения из данных в сокете, вам нужно знать тип поля. Когда вы прочитаете значение сокета, определите, какой тип он есть, и создайте Either
подкласс соответствующего типа (либо Either.Left
либо Either.Right
). При сериализации данных Java вызовите либо left
либо right
чтобы получить текущее значение.