将对象从java传输到C#
我必须在Java和C#之间进行通信,我需要通过socket服务器发送一个对象。这里,服务器部分用Java编写,客户端部分用C#编写。我想从服务器(Java)发送一个对象,然后在客户端(C#)接收它。但我做不到 LocalJobInfo.java:将对象从java传输到C#,java,c#,sockets,serialization,serversocket,Java,C#,Sockets,Serialization,Serversocket,我必须在Java和C#之间进行通信,我需要通过socket服务器发送一个对象。这里,服务器部分用Java编写,客户端部分用C#编写。我想从服务器(Java)发送一个对象,然后在客户端(C#)接收它。但我做不到 LocalJobInfo.java: package testsocket; import java.io.Serializable; public class LocalJobInfo implements Serializable{ private String id;
package testsocket;
import java.io.Serializable;
public class LocalJobInfo implements Serializable{
private String id;
private String message;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
服务器(Java语言):
在反序列化C#client中的字节[]时,我遇到了一个异常。
异常消息是:“输入流不是有效的二进制格式。起始内容(字节)是:AC-ED-00-05-73-72-00-17-74-65-73-74-73-73-73-6F-63-6B-65…”
现在我的问题是,我如何解决这个问题,以便用C代码进行反序列化,并用Java从服务器发送对象?您需要一个与语言无关的序列化框架。示例包括Google协议缓冲区、ASN.1、XSD 基本上,您需要将模式文件(如GPB.proto、or和ASN.1.ASN或.xsd)同时转换为POJO和POCO类(分别用于Java和C)。这就是GPB编译器或ASN.1编译器可以为您做的。因此,您最终会得到两种语言的类,并且这些类会序列化/反序列化到通用wire格式,或从通用wire格式序列化/反序列化到通用wire格式 XSD稍微复杂一些;微软的xsd.exe可以将.xsd文件转换为C#。我不知道Java是否也有类似的东西 我认为最好从谷歌协议缓冲区开始——它是免费的,并且会让你走。它同时支持JAVA和C
我不会碰你;代码生成工具似乎远远落后。有很多验证器可以告诉您已经收到或即将发送的消息是否符合JSON模式,但这并不能帮助您首先制定消息 您需要一个与语言无关的序列化框架。示例包括Google协议缓冲区、ASN.1、XSD 基本上,您需要将模式文件(如GPB.proto、or和ASN.1.ASN或.xsd)同时转换为POJO和POCO类(分别用于Java和C)。这就是GPB编译器或ASN.1编译器可以为您做的。因此,您最终会得到两种语言的类,并且这些类会序列化/反序列化到通用wire格式,或从通用wire格式序列化/反序列化到通用wire格式 XSD稍微复杂一些;微软的xsd.exe可以将.xsd文件转换为C#。我不知道Java是否也有类似的东西 我认为最好从谷歌协议缓冲区开始——它是免费的,并且会让你走。它同时支持JAVA和C
我不会碰你;代码生成工具似乎远远落后。有很多验证器可以告诉您已经收到或即将发送的消息是否符合JSON模式,但这并不能帮助您首先制定消息 使用对象的共享中间协议表示,如JSON或XML。您不能在Java中将对象直接序列化为二进制,而期望C能够对其进行反序列化。Java和C都有不同的默认序列化/反序列化模式,因此您需要使用第三方组件(JSON、XML或其他文本格式)标准化数据传输。用一种语言序列化和用另一种语言反序列化通常不能提供预期的结果。为什么不发送字节而不是编码到Ascii?您没有将ascii码解码回字节。发送方法和接收方法必须对称。发送的所有操作在接收时都必须按相反的顺序进行。它可以在JSON中转换数据。谢谢。使用对象的共享中间协议表示,如JSON或XML。您不能在Java中将对象直接序列化为二进制,而期望C能够对其进行反序列化。Java和C都有不同的默认序列化/反序列化模式,因此您需要使用第三方组件(JSON、XML或其他文本格式)标准化数据传输。用一种语言序列化和用另一种语言反序列化通常不能提供预期的结果。为什么不发送字节而不是编码到Ascii?您没有将ascii码解码回字节。发送方法和接收方法必须对称。发送的所有操作在接收时都必须按相反的顺序进行。它可以在JSON中转换数据。谢谢
List<LocalJobInfo> jobInfoList = new ArrayList<LocalJobInfo>();
LocalJobInfo jobInfo = new LocalJobInfo();
jobInfo.setId("1");
jobInfo.setMessage("Success");
jobInfoList.add(jobInfo);
ServerSocket serverSocket = new ServerSocket(4343, 10);
Socket socket = serverSocket.accept();
InputStream is = null;
OutputStream os = null;
String received = null;
try {
is = socket.getInputStream();
os = socket.getOutputStream();
byte[] lenBytes = new byte[4];
is.read(lenBytes, 0, 4);
int len = (((lenBytes[3] & 0xff) << 24) | ((lenBytes[2] & 0xff) << 16)
| ((lenBytes[1] & 0xff) << 8) | (lenBytes[0] & 0xff));
byte[] receivedBytes = new byte[len];
is.read(receivedBytes, 0, len);
received = new String(receivedBytes, 0, len);
System.out.println("Server received: " + received);
// Sending
byte[] toSendBytes = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(jobInfoList);
out.flush();
toSendBytes = bos.toByteArray();
} finally {
try {
bos.close();
} catch (IOException ex) {
// ignore close exception
}
}
int toSendLen = toSendBytes.length;
byte[] toSendLenBytes = new byte[4];
toSendLenBytes[0] = (byte) (toSendLen & 0xff);
toSendLenBytes[1] = (byte) ((toSendLen >> 8) & 0xff);
toSendLenBytes[2] = (byte) ((toSendLen >> 16) & 0xff);
toSendLenBytes[3] = (byte) ((toSendLen >> 24) & 0xff);
os.write(toSendLenBytes);
os.write(toSendBytes);
try {
Thread.sleep(10000);
} catch (Exception ex) {
}
} catch (Exception ex) {
}
socket.close();
serverSocket.close();
string toSend = "Hello!";
IPEndPoint serverAddress = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4343);
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(serverAddress);
// Sending
int toSendLen = System.Text.Encoding.ASCII.GetByteCount(toSend);
byte[] toSendBytes = System.Text.Encoding.ASCII.GetBytes(toSend);
byte[] toSendLenBytes = System.BitConverter.GetBytes(toSendLen);
clientSocket.Send(toSendLenBytes);
clientSocket.Send(toSendBytes);
// Receiving
byte[] rcvLenBytes = new byte[4];
clientSocket.Receive(rcvLenBytes);
int rcvLen = System.BitConverter.ToInt32(rcvLenBytes, 0);
byte[] rcvBytes = new byte[rcvLen];
clientSocket.Receive(rcvBytes);
MemoryStream memStream = new MemoryStream();
BinaryFormatter binForm = new BinaryFormatter();
memStream.Write(rcvBytes, 0, rcvBytes.Length);
memStream.Seek(0, SeekOrigin.Begin);
Object obj = (Object)binForm.Deserialize(memStream);