1

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对象。

4

3 回答 3

1

序列化格式特定于平台,Java 和 .NET 序列化彼此不兼容。改用 JSON(而且它也更容易调试)。

于 2013-08-02T21:20:56.063 回答
1

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

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

于 2013-08-02T21:24:13.433 回答
1

Serialization由于上述原因(Java 序列化与 C# 序列化不同),我建议您放弃,并以纯字节数组的形式在 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字符串转换为字节数组,并在其末尾添加一个空终止符。

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

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

于 2013-08-02T21:33:32.093 回答