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#Server App中的对象,但是有一个Exception。
“输入流不是有效的二进制格式。起始内容(以字节为单位)是:
00-05-73-72-00-1D-63-6F-6D-2E等“;
请提出任何简单的解决方案我的项目并不复杂。我只需要发送一个EMessage
对象。
答案 0 :(得分:1)
序列化格式特定于平台,Java和.NET序列化彼此不兼容。改为使用JSON(并且它也更容易调试)。
答案 1 :(得分:1)
为什么不使用SOAP,这里有一篇关于你正在做什么的文章(android到.net)
http://www.codeproject.com/Articles/29305/Consuming-NET-Web-Services-via-the-kSOAP-library
答案 2 :(得分:1)
由于上述原因(Java序列化与C#序列化不同),我建议您删除Serialization
,并在普通字节数组中在Java和C#应用程序之间传输数据。
您可以将Bitmap图像转换为类似的字节数组(taken from this post on 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#实现之间,不会遇到任何兼容性问题。它可能需要更多的代码和更多的理解,但它比两种语言之间的序列化更可靠。