我无法使用动态大小数组来封装结构。定长阵列很简单;只是增加了带有动态大小数组的数组结构
[MarshalAs(UnmanagedType.ByValArray, SizeConst = TheSizeOfTheArray)]
但是,当谈到动态大小的数组时,我感到茫然。为了简单起见,我将省略与代码中不相关的所有内容。
我发送此串行化结构的设备需要一个ushort通知有关数组的长度,然后是数组本身,最后是一个CRC。
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct MyNetworkMessage
{
public ushort Length { get; }
// This attribute does not work as I had hoped
[MarshalAs(UnmanagedType.ByValArray, SizeParamIndex = 1)]
private byte[] _messageData;
public ushort Crc { get; private set; }
public byte[] MessageData
{
get { return _data; }
private set { _data = value; }
}
public MyNetworkMessage(byte[] data)
{
MessageData = data;
Length = (ushort)data.Length;
Crc = Helper.CalcCrc(MessageData);
}
}
这个结构需要被序列化到其被发送过来的线到另一个装置,其中前两个字节是该阵列的长度的字节数组,而最后两个字节是MessageData的CRC :
Byte 0..1 Length of Data-field, N
Byte 2..N+2 Data
Byte N+3..N+4 CRC
我有很多不同的结构像这样需要被序列化并通过导线作为字节数组发送,因此处理这种通用的方式是我所追求的。为这个例子创建一个正确的字节数组非常简单,但我不希望为每个结构都编写序列化/反序列化,因为它们都只包含简单的数据。
我在这里看到过类似的问题,标记为重复,但没有看到任何满意的答案。
[查核'MarshalAsAttribute.SizeParamIndex'](https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.sizeparamindex%28v=vs.100%29) – 2015-03-03 09:44:20
@MatthewWatson属性如何帮助动态大小数组?在通信时应该知道你传递给属性的参数。 – Spo1ler 2015-03-03 09:55:37
@ Spo1ler我在想他可以在方法调用中使用它(它用于指示一个参数来动态指定数组大小),但实际上它看起来像是在手动序列化它。 – 2015-03-03 10:44:13