0

是否有可能将类的属性自动序列化为 byte[] 数组或流。

Stream stream = File.Open(@"C:/traiBin.bin", FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, this.rcpt);
stream.Close();

上面的这个例子序列化了整个类,包括命名空间、类名、变量名等。如果没有自动化解决方案,它将手动完成。

问候,马克

4

3 回答 3

1

您绝对应该看一下BinarySerializer库,该库生成stream时不会对数据产生任何额外开销。

下面举个例子,结果如下:

要序列化的类:

public class Packet
{
    [FieldOrder(0)]
    public byte StartByte = 0x88;

    [FieldOrder(1)]
    public byte Length { get; set; }

    [FieldOrder(2)]
    [FieldChecksum(nameof(Checksum), Mode = ChecksumMode.TwosComplement)]
    public byte[] Data { get; set; }

    [FieldOrder(3)]
    public byte Checksum { get; set; }
}

用法:

public void Serialize_UTxxxx_Should_SerializePacketWithDataOnly()
{
    var stream = new MemoryStream();
    var serializer = new BinarySerializer();
    //  ASCII 'Hello world!' in hex format
    var dataIn = new byte[] { 0x41, 0x61, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21 };

    Packet pck = new Packet()
    {
        Length = Convert.ToByte(dataIn.Length + sizeof(byte) + sizeof(byte) + sizeof(byte)),
        Data = dataIn
    };

    serializer.Serialize(stream, pck);

    byte[] dataOut = stream.ToArray();
    Debug.WriteLine(Encoding.UTF8.GetString(dataOut));
    Thread.Sleep(5000);
}

结果:

注意:这里,校验和仅根据Data值计算

在此处输入图像描述

于 2021-08-19T15:56:38.067 回答
0

我认为你必须:

或者实现你自己的序列化机制(根据你的要求可以不那么难),所以在流中你将有一种标头来标识保存的类型和类型数据流之后,在另一个标头及其类型数据流之后,等等上...

或者您可以使用类似http://www.codeproject.com/KB/cs/generic_deep_cloning.aspx的东西。只是序列化的一个例子,该文章的作者用于深度克隆目的。

于 2011-08-18T09:07:20.137 回答
0

Marc Gravell 的protobuf 实现支持属性模型以及 DataContracts - protobuf 在数据的最终大小方面也非常精简。

于 2011-08-18T10:28:38.070 回答