2010-05-21 5 views
7

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

+0

Welche Nachrichtenwarteschlange? – cletus

+0

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

Antwort

6

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.

+0

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

+0

C# ist .NET; Die 'BinaryReader'- und' BinaryWriter'-Klassen in meinen Beispielen sind .NET; Diese existieren nicht in Java. –

+0

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 –

1

JSON kommt in den Sinn. Oder es ist binäres Gegenstück, BSON. Beide haben Implementierungen in Java und .NET

+0

BSON sah vielversprechend aus, aber es scheint nicht viel Kundenbetreuung zu geben. Der Link "Java-Client" wird nur in einer einzelnen Quelldatei in einem DB-Treiber angezeigt. WTF? – EMP

0

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.

1

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.

Verwandte Themen