0

我有一个我想序列化到内存缓冲区的对象,然后通过 UART 将其发送到嵌入式设备。我在 Windows 上的 C# 环境中工作。

我想做的是创建两个如下所示的类:

class StatusElement
{
    byte statusPart1;
    byte statusPart2;
}

class DeviceCommand
{
    byte Address;
    byte Length;
    StatusElement[] statusElements; // Can have an arbitrary number of elements in it
}

我想使用序列化,最好是基于 c# 序列化的东西,将第二个类转换为字节流。

问题是嵌入式设备被硬编码以接受精确的序列(AddressByte、LengthByte .... ErrorCorrectionByte),所以我不能使用常规的 C# 序列化,它会在流中添加序列化元数据。这也排除了其他序列化,如 Protobuf。

所以我的问题是:是否可以自定义 c# 序列化以获得我需要的输出?如何?

- - 更新 - -

感谢大家的帮助。经过考虑,我决定使用反射和每个类型的处理程序来实现我自己的迷你序列化器。更复杂,但给了我更多的灵活性和自动化能力。

4

2 回答 2

1

使用 aMemoryStream手动序列化您的对象。

private byte[] Serialize()
{
    using (var ms = new MemoryStream())
    {
        ms.WriteByte(Address);
        ms.WriteByte(Length);
        foreach (var element in statusElements)
        {
            ms.WriteByte(element.statusPart1);
            ms.WriteByte(element.statusPart2);
        }
        return ms.ToArray();
    }
}

同样对于反序列化:

private static DeviceCommand Deserialize(byte[] input)
{
    DeviceCommand result = new DeviceCommand();
    using (var ms = new MemoryStream(input))
    {
        result.Address = ms.ReadByte();
        result.Length = ms.ReadByte();

        //assuming .Length contains the number of statusElements:
        result.statusElemetns = new StatusElement[result.Length];
        for (int i = 0; i < result.Length; i++)
        {
            result.statusElements[i] = new StatusElement();
            result.statusElements[i].statusPart1 = ms.ReadByte();
            result.statusElements[i].statusPart2 = ms.ReadByte();
        }
    }
    return result;
}
于 2012-08-12T13:41:26.450 回答
0

如果只需要写入字节或字节数组,可以直接使用 MemoryStream。如果您想使用其他 .NET 基本类型,请使用 System.IO.BinaryWriter / BinaryReader 访问您的 Stream。System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 使用此类进行二进制序列化和反序列化。

于 2012-08-12T14:15:42.847 回答