Лучший способ отправить числа с плавающей точкой от.NET до Java и назад

Я пишу приложение.NET, которое сделает вызов RPC к JAVA-приложению (через очередь сообщений). Данные, отправленные в обоих направлениях, будут большими массивами чисел с плавающей запятой. Что лучший способ состоит в том, чтобы сериализировать их, чтобы отправить им через провод? Я хотел бы что-то более компактное, чем текст, но архитектурно-независимый, поскольку сервер не может быть x86 машиной. JAVA-приложение может быть изменено по мере необходимости.

7
задан EMP 21 May 2010 в 04:56
поделиться

4 ответа

Числовые примитивы Java фактически хранятся (в JVM) и записываются (через jnava.io.DataOutputStream и java.nio.ByteBuffer ) в сетевом порядке и значениях с плавающей запятой. соответствуют стандарту IEEE. Они напрямую взаимозаменяемы с C # /. NET. Хорошо, если .NET предоставил сетевой порядок байтов для чтения двойников (см. Код ниже).

Таким образом, вы можете отправлять и получать любой примитив, используя два упомянутых здесь класса (и входные аналоги), пока .NET-сторона читает / записывает в сетевом порядке байтов, который вы всегда должны использовать.

Сторона Java, например:

// Assume the following somewhere in your class
Socket socket;
DataOutputStream out = new DataOutputStream(socket.getOutputStream());

// Send a double
out.writeDouble(doubleValue);

Сторона C # для получения значения:

Stream stream = new NetworkStream(socket, FileAccess.ReadWrite, true);
BinaryReader reader = new BinaryReader(stream, Encoding.UTF8);   

// Read double from the stream
long v = IPAddress.NetworkToHostOrder(reader.ReadInt64());   
double doubleValue = BitConverter.Int64BitsToDouble(v);

Для записи вы делаете обратное, C # должен писать в сетевом порядке байтов.

Stream stream = new NetworkStream(socket, FileAccess.ReadWrite, true);
BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8);

// Write double to the stream
long v = BitConverter.DoubleToInt64Bits(doubleValue);
writer.Write(IPAddress.HostToNetworkOrder(v));

А затем на стороне Java, чтобы прочитать их обратно в:

// Some where in your class
Socket socket;
DataInputStream in = new DataInputStream(socket.getInputStream());

// To read the double
double doubleValue = in.readDouble();

Класс C # IPAddress предоставляет методы чтения / записи сетевого порядка байтов для всех примитивов, кроме double и float, но, как в моем примере, вы может проходить через 32-битное или 64-битное int соответственно.

6
ответ дан 7 December 2019 в 05:18
поделиться

JSON приходит на ум. Или это двоичный аналог, BSON . Оба имеют реализации на Java и .NET

1
ответ дан 7 December 2019 в 05:18
поделиться

Текст - это действительно единственный независимый от платформы способ представления чисел с плавающей запятой, и его, конечно, проще всего сделать. Если вас беспокоит размер сообщения, вы всегда можете запечатать его в GZip.

0
ответ дан 7 December 2019 в 05:18
поделиться

Сейчас я читаю о Protocol Buffers и они выглядят многообещающе. Существует официальная реализация Google для Java и порт C#, созданный не кем иным, как Jon Skeet.

1
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: