【发布时间】:2018-03-16 14:59:43
【问题描述】:
大家好, 我正在使用套接字创建客户端-服务器游戏。我正在尝试使用结构化消息,然后对它们进行序列化和反序列化,我的结构中有 3 个字符串。我的代码序列化了第一个字符串,但弄乱了后面的两个。有人告诉我,我的结构可能只有一个字符串有足够的空间空间。
我的消息结构:
public struct Message_PDU
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10101)]
public string commandID;
public string playerIndex;
public string score;
};
序列化方法
private byte[] Serialize(Object myObject)
{
int size = Marshal.SizeOf(myObject);
IntPtr ip = Marshal.AllocHGlobal(size); //allocate unmanaged memory equivelent to the size of the object
Marshal.StructureToPtr(myObject, ip, false); //marshal the object into the allocated memory
byte[] byteArray = new byte[size];
Marshal.Copy(ip, byteArray, 0, size); //place the contents of memory into a byte[]
Marshal.FreeHGlobal(ip); //free unmanaged memory
return byteArray;
}
发送消息代码:
String szdata1 = "--";
String szdata2 = AlliasText.Text;
String szdata3 = "1";
Message_PDU myPDU = new Message_PDU();
myPDU.commandID = szdata1;
myPDU.playerIndex = szdata2;
myPDU.score = szdata3;
byte[] byData = Serialize(myPDU); //convert structure into a byte[]
m_ClientSocket.Send(byData, SocketFlags.None);
我尝试增加 SizeConst,但没有奏效。调试显示只有第一个字符串被序列化。 谢谢
【问题讨论】:
-
MarshalAs 属性仅应用于第一个字符串。您还应该使用 StructLayout 顺序。
-
为什么都是字符串?我觉得所有这些都应该是某种整数类型。
-
Marshal是处理序列化的一种非常脆弱的方法——我不推荐它——但是:你说“它不起作用”——发生了什么?你看到了什么? -
罗恩,感谢您的评论。我正在使用 StructLayout,但我的帖子中没有包含该行。
-
我相信它可以是字符串或整数,因为它无论如何都会被转换成字节。 @MarcGravell 反序列化时收到的错误消息是:System.AccessViolationException:'尝试读取或写入受保护的内存。这通常表明其他内存已损坏。但是当我调试时,我可以看到我的十六进制“--”字符串,但其余的变成随机值。