Estoy escribiendo una aplicación .NET que hará una llamada RPC a una aplicación Java (a través de una cola de mensajes). Los datos enviados en ambas direcciones serán grandes conjuntos de números de coma flotante. ¿Cuál es la mejor manera de serializarlos para enviarlos a través del cable? Me gustaría algo más compacto que el texto, pero independiente de la arquitectura ya que el servidor puede no ser una máquina x86. La aplicación Java se puede cambiar según sea necesario.La mejor manera de enviar números de coma flotante de .NET a Java y volver
Respuesta
Las primitivas numéricas de Java en realidad se almacenan (en la JVM) y se escriben (a través de jnava.io.DataOutputStream
y java.nio.ByteBuffer
) en orden de red y los valores de coma flotante son estándar IEEE. Son directamente intercambiables con C# /. NET. Bueno, si .NET proporcionó el orden de bytes de red para leer dobles (ver abajo el código).
Por lo tanto, puede enviar y recibir cualquier primitiva utilizando las dos clases mencionadas aquí (y las contrapartes de entrada) siempre que el lado .NET esté leyendo/escribiendo en orden de bytes de red como siempre debería usar.
lado de Java, por ejemplo:
// Assume the following somewhere in your class
Socket socket;
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Send a double
out.writeDouble(doubleValue);
C# lateral para recuperar el valor:
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);
Para escribir haces lo contrario, C# tiene que escribir en orden de bytes de red.
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));
Y a continuación, en el lado de Java para leer estas de vuelta en:
// Some where in your class
Socket socket;
DataInputStream in = new DataInputStream(socket.getInputStream());
// To read the double
double doubleValue = in.readDouble();
El C# IPAddress
clase proporciona orden de bytes de red métodos de lectura/escritura para todas las primitivas excepto doble y flotador, pero como en mi Por ejemplo, puede pasar a través de una int de 32 bits o de 64 bits respectivamente.
Ya sabes, podría seguir con este enfoque simple. .NET también tiene 'System.IO.BinaryWriter' y' System.IO.BinaryReader' que manejan la serialización. (No utilizaré clases de socket directamente.) – EMP
C# es .NET; las clases 'BinaryReader' y' BinaryWriter' en mis ejemplos son .NET; estos no existen en Java. –
Si desea poner los valores en matrices de bytes y operar en ellos por separado, es posible que desee utilizar 'java.nio.ByteBuffer' de Java. Ver mi respuesta aquí: http://stackoverflow.com/questions/2868885/representing-a-number-in-a-byte-array-java-programming/2870823#2870823 –
El texto es realmente la única plataforma independiente que representa los números de punto flotante, y sin duda es la más fácil de hacer. Si le preocupa el tamaño del mensaje, siempre puede almacenar sus mensajes.
Actualmente estoy leyendo sobre Protocol Buffers y se ven prometedores. Hay una implementación oficial de Google para Java y una C# port of it nada menos que por Jon Skeet.
- 1. Corrección de números en coma flotante
- 2. formato de números de coma flotante
- 3. Números de coma flotante y subnormales de 80 bits
- 4. Convertir bytes en números de coma flotante en Python
- 5. números en coma flotante - número más cercano a 1.7
- 6. ¿La mejor manera de analizar un archivo de coma flotante grande almacenado en ASCII?
- 7. Convierte de punto flotante de IBM a estándar de coma flotante IEEE y viceversa - ¿C#?
- 8. Tratando con los errores de coma flotante en .NET
- 9. ¿Cuántos números de coma flotante distintos en un rango específico?
- 10. expresiones regulares para analizar los números de coma flotante internacionales
- 11. ¿Qué tipos de números son representables en coma flotante binario?
- 12. de coma flotante Limitaciones
- 13. C - redondeo de coma flotante
- 14. Prueba de igualdad de coma flotante. (FE_FLOATING_POINT_EQUALITY)
- 15. Punto flotante determinista y .NET
- 16. ordenar la lista de números de coma flotante en los grupos
- 17. Comparación de coma flotante 0
- 18. Ejemplos de imprecisión de coma flotante
- 19. problemas en la comparación de coma flotante
- 20. ¿Cómo se calcula div y mod de números de coma flotante?
- 21. Operación de módulo de coma flotante
- 22. Coseno en coma flotante
- 23. No se pueden imprimir los números de coma flotante de la biblioteca compartida ejecutable
- 24. "mejor" manera de comunicarse entre .NET 1.1 y .NET 3.5
- 25. Java flotante de conversión a entero
- 26. coma flotante excepción
- 27. ¿Deberíamos comparar los números de coma flotante para la igualdad con un error * relativo *?
- 28. Tipos de coma flotante de tamaño fijo
- 29. ¿Qué es un "valor de sesgo" de números de coma flotante?
- 30. números de expresiones regulares a juego con punto flotante
¿Qué cola de mensajes? – cletus
RabbitMQ, pero probablemente tampoco quiero depender de eso. Le enviaré una serie de bytes y me ocuparé de la serialización. – EMP