正在将对象从Android客户端应用程序发送到C#服务器应用程序

本文关键字:应用程序 服务器 客户端 对象 Android | 更新日期: 2023-09-27 18:26:26

Java代码:

public class EMessage implements Serializable
{
private Bitmap image;
private String type;
EMessage()
{}
}
...
EMessage eMessage=new EMessage();
outToServer = new DataOutputStream(clientSocket.getOutputStream());
objectOutputStream=new ObjectOutputStream(outToServer);
objectOutputStream.writeObject(eMessage);

C#代码:

[Serializable]
class EMessage
{
    private Bitmap image;
    private String type;
    EMessage()
    { }
}
client = server.AcceptTcpClient();
 Connected = client.Connected;
            ns = client.GetStream();
 IFormatter formatter = new 
 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
 EMessage recievedmsg = (EMessage)formatter.Deserialize(ns);

当我从Android客户端应用程序(java编码)发送一个对象时,我在C#服务器应用程序中收到了该对象,但出现了异常。"输入流不是有效的二进制格式。起始内容(以字节为单位)为:00-05-73-72-00-1D-63-6F-6D-2E等";请提出任何简单的解决方案。我的项目没有那么复杂。我只需要发送一个EMessage对象。

正在将对象从Android客户端应用程序发送到C#服务器应用程序

序列化格式是特定于平台的,Java和.NET序列化彼此不兼容。请改用JSON(这样调试起来也更容易)。

为什么不使用SOAP,这里有一篇关于你正在做什么(android到.net)的文章

http://www.codeproject.com/Articles/29305/Consuming-NET-Web-Services-via-the-kSOAP-library

由于上述原因(Java序列化与C#序列化不同),我建议您放弃Serialization,并在Java和C#应用程序之间以纯字节数组传输数据。

您可以将位图图像转换为如下字节数组(取自so上的这篇文章):

Bitmap bmp = intent.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();

当然,如果情况需要,您可以更改CompressFormat。之后,您也可以将type字符串转换为字节数组,并在其末尾添加一个null终止符

到达后,您可以先发送type字符串,然后在其后面添加位图的字节数组。在C#端,您可以读取传入数据,直到到达0终止符,此时您将知道您已经读取了EMessage对象的字符串部分,然后读取发送的其余字节,并将它们解析为Bitmap对象。

这样,您就可以确保在Java和C#实现之间不会遇到任何兼容性问题。它可能需要更多的代码和理解,但它比在两种语言之间序列化要可靠得多。