高度定制的序列化

时间:2012-08-12 13:25:53

标签: c# .net serialization customization

我有一个对象我想序列化到内存缓冲区,然后通过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#序列化以获得我需要的输出?怎么样?

---更新---

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

2 个答案:

答案 0 :(得分:1)

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

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;
}

答案 1 :(得分:0)

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