代码之家  ›  专栏  ›  技术社区  ›  EMP

将浮点数从.NET发送到Java和回溯的最佳方法

  •  7
  • EMP  · 技术社区  · 14 年前

    我正在编写一个.NET应用程序,它将对一个Java应用程序(通过消息队列)进行RPC调用。向两个方向发送的数据将是大量的浮点数字数组。什么是将它们序列化以便跨线发送的最佳方法?我想要比文本更紧凑的东西,但是架构独立,因为服务器可能不是x86机器。可以根据需要更改Java应用程序。

    4 回复  |  直到 14 年前
        1
  •  6
  •   Kevin Brock    14 年前

    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进行传递。

        2
  •  1
  •   Robert Harvey    14 年前

    JSON 浮现在脑海中。或者是二元对应物, BSON . 两者都在Java和.NET中实现。

        3
  •  1
  •   EMP    14 年前

    我目前正在阅读 Protocol Buffers 他们看起来很有前途。谷歌和Java有一个正式的谷歌实现 C# port of it 除了乔恩·斯基特。

        4
  •  0
  •   luke    14 年前

    文本实际上是唯一一种与平台无关的表示浮点数的方法,而且它确实是最容易做到的。如果您关心消息的大小,那么可以始终gzip您的消息。