.net - 结构到字节数组以通过套接字发送

标签 .net sockets serialization bytearray struct

从结构中获取字节数组以通过 TCP 套接字发送的最佳方法是什么?我正在使用 .Net(VB 或 C#)。

最佳答案

一种选择是将结构的 native 表示直接编码到缓冲区中,类似于 memcpy 在 C 中的工作方式。

您需要将适当的属性添加到您的结构中,

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack=1)]

然后您可以使用以下方式对其进行序列化:

    /// <summary>
    /// Serializes the specified object into a byte array.
    /// </summary>
    /// <param name="nativeObject">The object to serialize.</param>
    /// <returns></returns>
    public static byte[] Serialize(object obj)
    {
        Type objectType = obj.GetType();
        int objectSize = Marshal.SizeOf(obj);
        IntPtr buffer = Marshal.AllocHGlobal(objectSize);
        Marshal.StructureToPtr(obj, buffer, false);
        byte[] array = new byte[objectSize];
        Marshal.Copy(buffer, array , 0, objectSize);
        Marshal.FreeHGlobal(buffer);
        return array;
    }

不过,这是迄今为止最不便携的解决方案。双方都需要使用相同的对齐方式和字节顺序,如果您需要更改结构本身,则需要自己实现版本控制。

在大多数情况下,您的序列化格式不应是内部数据结构的直接副本。

关于.net - 结构到字节数组以通过套接字发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/650815/

相关文章:

c - 线程执行时陷入无限循环

c# - 将进程作为 Windows 服务运行时的最佳做法是什么?

.net - 是否有与 UWP Split View汉堡菜单等效的 WPF?

c# - "Anonymous Recursion"在 .NET 中有效吗?它在单声道

linux - 如何以编程方式增加 LInux 上 UDP 套接字的每个套接字缓冲区?

c - 在c中通过套接字发送结构

c# - ShouldSerialize*() 与 *指定的条件序列化模式

serialization - 将 MongoDB BsonDocument 转换为字符串

c# - 使用 SSDT 作为 T4 模板的来源

c# - 如何在 C# 中比较两个实例的内容?