我今天启动了Windows移动编程,并且已成功连接到我的服务器。
我在Visual Studio上创建的应用程序不是通用应用程序,而是Windows Mobile应用程序。
API DataWriter
用于将数据写入输出流,在应用程序方案中,输出流是套接字。即:
DataWriter dw = new DataWriter(clientSocket.OutputStream);
我一直关注的方法之一是WriteBytes
和WriteBuffer
(可以找到API documentation for DataWriter的文档
我使用哪种方法,为什么? 如何转换此类并使用上述方法将其发送到我的服务器。
public class Message
{
public string pas { get; internal set; }
public int type { get; internal set; }
public string us { get; internal set; }#
}
//the below code goes in a seperate function
DataWriter dw = new DataWriter(clientSocket.OutputStream);
Message ms = new Message();
ms.type = 1;
ms.us = usernameTextBox.Text;
ms.pas = usernameTextBox.Text;
//TODO: send ms to the server
答案 0 :(得分:2)
在这两种方法之间,WriteBytes()
似乎是更简单的方法。 WriteBuffer()
为您提供了对输出缓冲区/流的更多控制,您可以在需要时随时使用它。但是,对于所有意图和目的,如果您只需要打开一个连接并发送一个字节流,WriteBytes()
就可以完成这项工作。
如何转换此类并将其发送到我的服务器
这完全取决于你,真的。您要做的是定义如何“序列化”您的类通过连接进行传输(从而在其他代码时必须“反序列化”它接收数据)。
还有a few ways to do that等等。一个直截了当的方法(取自该链接问题的最佳答案)将是使用BinaryFormatter
类。像这样:
var ms = new Message();
ms.type = 1;
ms.us = usernameTextBox.Text;
ms.pas = usernameTextBox.Text;
byte[] serializedMessage;
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, ms);
serializedMessage = ms.ToArray();
}
// now serializedMessage is a byte array to be sent
然后在另一端你需要将它反序列化回一个对象实例。可能看起来像这样:
// assuming you have a variable called serializedMessage as the byte array received
Message ms;
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter();
stream.Write(serializedMessage, 0, serializedMessage.Length);
stream.Seek(0, SeekOrigin.Begin);
ms = (Message)formatter.Deserialize(stream);
}
您当然可以在更简单的界面后面抽象这些。或者,如果您在序列化中寻找任何类型的人类可读性,您可以尝试类似JSON序列化程序并直接将字符串转换为字节数组等。
编辑:请注意,这只是“序列化”对象的众多方法之一的示例。并且,正如用户在下面的评论中指出的那样,使用这个二进制序列化器可能会有缺点。
你可以使用任何序列化程序。你甚至可以自己做。技术上覆盖.ToString()
以打印所有属性,然后调用它是一种序列化形式。概念总是相同的......将内存中对象转换为可传输的数据,以后可以构建相同的内存中对象。 (从技术上讲,保存到数据库是一种序列化形式。)