Ich schreibe eine .NET-Anwendung, die einen RPC-Aufruf an eine Java-Anwendung (über eine Nachrichtenwarteschlange) macht. Die Daten, die in beide Richtungen gesendet werden, sind große Arrays von Gleitkommazahlen. Was ist der beste Weg, sie zu serialisieren, um sie über den Draht zu senden? Ich möchte etwas kompakter als Text, aber Architektur-unabhängig wie der Server möglicherweise nicht eine x86-Maschine sein. Die Java-Anwendung kann nach Bedarf geändert werden.Die beste Methode zum Senden von Fließkommazahlen von .NET nach Java und zurück
Antwort
Java-numerische Primitive werden tatsächlich (in der JVM) gespeichert und (über jnava.io.DataOutputStream
und java.nio.ByteBuffer
) in Netzwerkreihenfolge geschrieben und die Fließkommawerte entsprechen dem IEEE-Standard. Sie sind direkt mit C# /. NET austauschbar. Nun, wenn .NET die Netzwerk-Byte-Reihenfolge zum Lesen verdoppelt hat (siehe unten für Code).
So können Sie jedes primitive Element mit den beiden hier genannten Klassen (und den Gegenstücken in der Eingabe) senden und empfangen, solange die .NET-Seite in Netzwerkbyte-Reihenfolge liest/schreibt, wie Sie es immer verwenden sollten.
Java-Seite zum Beispiel:
// Assume the following somewhere in your class
Socket socket;
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Send a double
out.writeDouble(doubleValue);
C# Seite den Wert abzurufen:
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);
Zum Schreiben Sie das Gegenteil tun, hat C# in Netzwerk-Byte-Reihenfolge zu schreiben.
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));
Und dann auf der Java-Seite diese in zurück zu lesen:
// Some where in your class
Socket socket;
DataInputStream in = new DataInputStream(socket.getInputStream());
// To read the double
double doubleValue = in.readDouble();
Die C# IPAddress
-Klasse stellt für all Primitiven Netzwerk-Byte-Reihenfolge Lesen/Schreiben Methoden außer Doppel und Schwimmer, aber wie in meinem Beispiel, das Sie entweder durch einen 32-Bit- oder 64-Bit-Int durchlaufen können.
Sie wissen, ich könnte einfach mit diesem einfachen Ansatz gehen. .NET hat auch 'System.IO.BinaryWriter' und' System.IO.BinaryReader', die die Serialisierung behandeln. (Ich werde Socket-Klassen nicht direkt verwenden.) – EMP
C# ist .NET; Die 'BinaryReader'- und' BinaryWriter'-Klassen in meinen Beispielen sind .NET; Diese existieren nicht in Java. –
Wenn Sie die Werte in Byte-Arrays einfügen und diese separat verarbeiten möchten, sollten Sie Javas 'java.nio.ByteBuffer' verwenden. Siehe meine Antwort hier: http://stackoverflow.com/questions/2868885/representting-a-number-in-a-byte-array-java-programming/2870823#2870823 –
Text ist wirklich die einzige plattformunabhängige Art, Gleitkommazahlen darzustellen, und es ist sicherlich die einfachste zu tun. Wenn Sie sich Gedanken über die Nachrichtengröße machen, können Sie Ihre Nachrichten immer mit GZip versenden.
Ich lese gerade über Protocol Buffers und sie sehen vielversprechend aus. Es gibt eine offizielle Google-Implementierung für Java und eine C# port of it von keinem anderen als Jon Skeet.
- 1. Die beste Methode zum Bearbeiten von XML in .NET
- 2. Beste Methode zum Abrufen von Daten in XPages und Java
- 3. Die beste Methode zum Kopieren von HTML-Dateien nach wwwroot?
- 4. Die beste Methode zum Ändern von Konstanten im Java-Buildprozess
- 5. Java - Die beste Methode zum Drucken von 2D-Arrays?
- 6. Die beste Methode zum Definieren von True, False und Unset
- 7. Die beste Methode zum Speichern von Dateien
- 8. Die beste Methode zum Verwalten von Datenbankänderungen
- 9. Die beste Methode zum Lesen, Ändern und Schreiben von XML
- 10. Die beste Methode zum Senden von Informationen von einem clientseitigen Ruby-Skript an eine Rails-App?
- 11. Beste Methode zum Senden von Daten über Geräte? (Android)
- 12. Die beste Methode zum Validieren von WCF- und WebService-Methodenparameterwerten
- 13. Beste Methode zum Drucken. NET-Quellcode
- 14. Die beste Methode zum Umwandeln von Animal [] in Hund []
- 15. Die beste Methode zum Erstellen von Singleton-Arrays
- 16. Die beste Methode zum Implementieren von Self-Updating-Software
- 17. Beste Möglichkeit zum Drucken von C#/.net?
- 18. Die beste Methode zum benutzerdefinierten Bearbeiten von Datensätzen in ASP.NET?
- 19. Die beste Methode zum Sortieren einer ArrayList in Java
- 20. Die beste Methode zum atomaren Erstellen von Dateien
- 21. Dezimalzahl, Fließkommazahlen
- 22. Was ist die beste Java-Methode zum Erstellen von JSON/XML-REST-Webdiensten, die WCF ähnelt?
- 23. Die beste Methode zum Planen von Aufgaben in C#
- 24. Die beste Methode zum Floaten?
- 25. Die beste/gebräuchlichste Methode zum Aktualisieren der Benutzeroberfläche von Hintergrundthread
- 26. Die beste Methode zum Speichern von Formularwerten in PHP Cookie?
- 27. Die beste Methode zum Hinzufügen von Metadaten zu HTML-Elementen
- 28. Beste Methode zum Speichern/Abrufen von Diensteigenschaften
- 29. Senden von Nachrichten von PHP nach Java
- 30. Die beste Methode zum Ausführen eines Tools von ASP.Net Seite
Welche Nachrichtenwarteschlange? – cletus
RabbitMQ, aber davon will ich wahrscheinlich auch nicht abhängen. Ich schicke es einfach eine Reihe von Bytes und kümmere mich selbst um die Serialisierung. – EMP