繁体   English   中英

将对象从Android客户端应用程序发送到C#Server App

[英]Sending object from Android Client App to C# Server App

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中的对象,但有一个例外。 “输入流不是有效的二进制格式。起始内容(以字节为单位)为:00-05-73-72-00-1D-63-6F-6D-2E等”; 请提出任何简单的解决方案 我的项目并不复杂。 我只需要发送一个EMessage对象。

序列化格式特定于平台,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#应用程序之间传输数据。

您可以将Bitmap图像转换为类似的字节数组( 取自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#实现之间,你不会遇到任何兼容性问题。 它可能需要更多的代码和更多的理解,但它比两种语言之间的序列化更可靠。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM