如何导出二进制文件中的类

本文关键字:二进制文件 何导出 | 更新日期: 2023-09-27 18:12:23

我需要将一个可观察集合导出为二进制文件。该文件将被嵌入式软件解析。

这是我的Led配置类:

[XmlRoot("ConfLed")]
public class LedVals
{
    #region Properties
    [XmlAttribute]
    public int ID { get; set; }
    [XmlAttribute]
    public string Type { get; set; } = "Trigger";
    [XmlAttribute]
    public string Binding { get; set; } = "OFF";
    [XmlAttribute]
    public int Trigger1 { get; set; } = 0;
    [XmlAttribute]
    public int Trigger2 { get; set; } = 0;
    [XmlAttribute]
    public string ColorT0 { get; set; } = "#000000";
    [XmlAttribute]
    public string ColorT1 { get; set; } = "#000000";
    [XmlAttribute]
    public string ColorT2 { get; set; } = "#000000";
    #endregion
    public LedVals()
    {
    }
    public LedVals(int idParam, string typeParam, string bindingParam, int trig1Param, int trig2Param, string c0Param, string c1Param, string c2Param)
    {
        this.ID = idParam;
        this.Type = typeParam;
        this.Binding = bindingParam;
        this.Trigger1 = trig1Param;
        this.Trigger2 = trig2Param;
        this.ColorT0 = c0Param;
        this.ColorT1 = c1Param;
        this.ColorT2 = c2Param;
    }
}

这是我需要导出的LedVals类(ListeLedTable)的可观察集合的序列化函数

    public void SerializeLedTable(string filePathParam)
    {
        try
        {
            using (Stream mstream = File.Open(filePathParam + ".bin", FileMode.Create))
            {
                BinaryFormatter bin = new BinaryFormatter();
                bin.Serialize(mstream, ListeLedTable);
            }
        }
    }

结果是一个包含类属性的二进制值和可观察集合结构的文本描述的文件。

是否有一种方法可以像这样导出类的属性值?

我可以使用binaryWriter在循环中编写类的每个属性,但我认为可能有一个更简单的解决方案。

如何导出二进制文件中的类

使用Marshal技巧:

    class Program
    {
        static void Main(string[] args)
        {
            LedVals ledVals = new LedVals();
            int size = Marshal.SizeOf(ledVals); ;
            IntPtr ptr = Marshal.AllocHGlobal(size);
            byte[] buffer = new byte[Marshal.SizeOf(ledVals)];
            Marshal.StructureToPtr(ledVals, ptr, true);
            Marshal.Copy(ptr, buffer, 0, Marshal.SizeOf(ledVals));
            Marshal.FreeHGlobal(ptr);
            FileStream stream = File.OpenWrite("FILENAME");
            BinaryWriter bWriter = new BinaryWriter(stream, Encoding.UTF8);
            bWriter.Write(buffer);
        }
    }
   [StructLayout(LayoutKind.Sequential)]
    public class LedVals
    {
       public int ID { get; set; }
    }

在任何互操作中使用。net二进制序列化都是一个坏主意。

XML可能是更好的选择,但是嵌入式设备通常缺乏执行任何XML处理所需的能力。我不知道你的嵌入式平台是什么,但有一个机会,你可以使用协议缓冲区(协议缓冲区)来回传输二进制数据。