有一个Java服务器,现在想从C#之中通过UDP传送自己定义的可序列化的对象来调用Java服务器,
=============================
Java服务器的相关的代码如下:
int portNumber = 8888;
ds = new DatagramSocket(portNumber);
pktReceive = new DatagramPacket(new byte[1024], 1024);ds.receive(pktReceive);
ByteArrayInputStream bis = new ByteArrayInputStream(pktReceive.getData());
ObjectInputStream ois = new ObjectInputStream(bis);=============================
C#客户端的相关代码为:
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);Message msg = new Message(); //Message类是一个自己定义的Serializable的类BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, msg);
Byte [] data = stream.ToArray();server.SendTo(data,data.Length, SocketFlags.None, ipep);但是调用的时候老是出现下面的错误:
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at com.lblabs.net.Server.main(Server.java:55)就是Java服务器端的:ObjectInputStream ois = new ObjectInputStream(bis); 出的错误   请问大虾,怎样才能在C#和Java之间通过UDP传送对象呢?弄了半天也没有弄好,多谢!

解决方案 »

  1.   

    C#中的二进制序列化(BinaryFormatter )保持类型保真度,它将对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。我对Java不了解,你去查一下ObjectInputStream 内部用的什么序列化算法。
    但按照错误信息,应该是C#中的序列化与Java中的序列化不兼容,C#序列化后发过去,Java识别不了你试一下下面两种方法,看行不行:
      1. Java服务器端不用ObjectInputStream 直接从网络流中构造对象,而是用Java中的BinaryFormatter 来反序列化你得到的bis ByteArrayInputStream流,如果Java中的对象与C#中的对象兼容的话,这种方法应该可行  2. 如果上面的方法不行的话,将BinaryFormatter换成XML或SOAP 序列化 ,处理过程同上面的第一种方法一样。不要用BinaryFormatter 来序列化你要传输的数据,因为二进制序列化保持类型保真度。而XML和SOAP序列化仅序列化公共属性和字段,且不保持类型保真度。