通过 TCP 连接发送对象

Send object over a TCP connection

我今天开始 windows 移动编程,我已经成功连接到我的服务器。

我在 Visual Studio 上制作的应用程序不是通用应用程序,而是 Windows 移动应用程序。

APIDataWriter用于将数据写入输出流,在应用场景中输出流就是socket。即:

            DataWriter dw = new DataWriter(clientSocket.OutputStream);

我一直在研究的方法之一是 WriteBytesWriteBuffer (可以在 API documentation for DataWriter 处找到她的文档 .

我使用哪种方法,为什么? 我如何转换此 class 并使用上述方法将其发送到我的服务器。

    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

在这两种方法中,WriteBytes() 似乎是更简单的方法。 WriteBuffer() 让您可以更好地控制输出 buffer/stream,您当然可以在需要时使用它。但是,就所有意图和目的而言,如果您只需要简单地打开一个连接并向其发送一个字节流,WriteBytes() 就可以完成这项工作。

How can I convert this class and sent it to my server

这完全取决于您,真的。你必须做的是定义你将如何“序列化”你的class通过连接传输(因此必须“反序列化”当其他代码收到数据时。

a few ways to do that,等等。一种直接的方法(取自该链接问题的最佳答案)是使用 BinaryFormatter class。像这样:

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 序列化程序并将字符串直接转换为字节数组等。


编辑: 请注意,这实际上只是 "serialize" 对象的众多方法之一的示例。而且,正如用户在下面的评论中指出的那样,使用此二进制序列化程序可能存在缺点。

可以使用任何序列化程序,真的。你甚至可以自己制作。技术上覆盖 .ToString() 以打印所有属性,然后调用它是一种序列化形式。这个概念总是一样的……将内存中的对象转换为可传输的数据,以后可以从中构建一个相同的内存中的对象。 (从技术上讲,保存到数据库是一种序列化形式。)