通过 TCP 连接发送对象
Send object over a TCP connection
我今天开始 windows 移动编程,我已经成功连接到我的服务器。
我在 Visual Studio 上制作的应用程序不是通用应用程序,而是 Windows 移动应用程序。
APIDataWriter
用于将数据写入输出流,在应用场景中输出流就是socket。即:
DataWriter dw = new DataWriter(clientSocket.OutputStream);
我一直在研究的方法之一是 WriteBytes
和 WriteBuffer
(可以在 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()
以打印所有属性,然后调用它是一种序列化形式。这个概念总是一样的……将内存中的对象转换为可传输的数据,以后可以从中构建一个相同的内存中的对象。 (从技术上讲,保存到数据库是一种序列化形式。)
我今天开始 windows 移动编程,我已经成功连接到我的服务器。
我在 Visual Studio 上制作的应用程序不是通用应用程序,而是 Windows 移动应用程序。
APIDataWriter
用于将数据写入输出流,在应用场景中输出流就是socket。即:
DataWriter dw = new DataWriter(clientSocket.OutputStream);
我一直在研究的方法之一是 WriteBytes
和 WriteBuffer
(可以在 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()
以打印所有属性,然后调用它是一种序列化形式。这个概念总是一样的……将内存中的对象转换为可传输的数据,以后可以从中构建一个相同的内存中的对象。 (从技术上讲,保存到数据库是一种序列化形式。)